优化游标的Max()和DENSE_RANK分析查询

时间:2014-10-08 14:35:40

标签: sql oracle cursor analytical

我有一个查询需要花费很长时间(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

谢谢,

1 个答案:

答案 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;

如果您知道每月至少添加一次文档。