我有这个大型事务数据库,我正试图从中提取数据。基本上,标题表中的一个字段中有一个“0”,每次执行此存储过程时,我都想从标题中获取 n 行具有 0 的行,但只有那些符合某些条件的行,其中之一是连接表(当然是索引的)具有与我指定的常量匹配的值。
这是查询:
select /*+ FIRST_ROWS(1000)*/ T.ID
from HEADER T
JOIN (
SELECT /*+ parallel(TC,4) FULL(TC) */
tc.ID, tc.SOURCE_ID, tc.CUSTOMER_IDENTIFIER FROM
SUBTABLE tc, (SELECT ID, MAX(IDENT_SEQUENCE_ID) as IDENT_SEQUENCE_ID FROM SUBTABLE
WHERE SOURCE_ID = 9002 AND upper(trim(CUSTOMER_IDENTIFIER)) <> 'UNKNOWN' GROUP BY ID) maxtc
WHERE maxtc.ID = tc.ID AND
maxtc.CUST_IDENT_SEQUENCE_ID = tc.CUST_IDENT_SEQUENCE_ID
) cust
ON t.ID = cust.ID
where T.batch=0 and T.status=6 and rownum <= SOME_NUMBER_HERE;
我希望“FIRST_ROWS”或 rownum 限制将使这基本上只是寻找第一个“SOME_NUMBER_HERE”记录数并返回,但似乎 Oracle 正在扫描整个表?
无论如何,在找到一定数量的匹配行之后,通过停止连接内的 select 语句来使其运行得更快?
我在 SUBTABLE 上有 CUSTOMER_IDENTIFIER 和 SOURCE_ID 的索引,在 HEADER 上有 BATCH/STATUS 的索引。
当我有十万行时,这似乎运行亚秒,但在数百万行上运行时需要几分钟......提前感谢您的帮助......