我有一个查询需要花费很长时间(187.42秒)来查找包含属性(c.scr)的所有相关文档,并从该列表中为我提供了使用最新文档日期处理的文档。我想知道是否有人可以提供任何优化查询的建议。
请注意,我确实玩过ROW_NUMBER,RANK和DENSE_RANK,它们甚至更慢,所以这是我到目前为止最好的。
(Query) total time '187.42 seconds':
SELECT MAX(A.DOC_NUM) KEEP (DENSE_RANK FIRST ORDER BY A.DOC_DT DESC) as DOC_NUM
FROM AB A , CD C
WHERE A.ID = C.ID
AND SUBSTR(C.SCR,20,8) = '123123123';
(Data Set) :
DOC_NUM DOC_DT
AB201201230000058 JAN-23-12
AB201206280000674 JUN-28-12
AB201406230000066 AUG-05-14
AB201406230000066 AUG-05-14
AB201312170000227 DEC-17-13
AB201312180000093 DEC-19-13
谢谢,
答案 0 :(得分:1)
您可以尝试这样做:
SELECT A.*
FROM (SELECT A.DOC_NUM
FROM AB A JOIN
CD C
ON A.ID = C.ID
WHERE SUBSTR(C.SCR, 20, 8) = '123123123'
ORDER BY A.DOC_DT DESC
) A
WHERE rownum = 1;
然后,您可以通过各种方式加快速度。索引可能会有所帮助(如果没有)。此外,因为您正在寻找最新的文档,所以减少结果集可能会有所帮助:
SELECT A.*
FROM (SELECT A.DOC_NUM
FROM AB A JOIN
CD C
ON A.ID = C.ID
WHERE SUBSTR(C.SCR, 20, 8) = '123123123' AND A.DOC_DT >= sysdate - 30
ORDER BY A.DOC_DT DESC
) A
WHERE rownum = 1;
如果您知道每月至少添加一次文档。