0

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

谢谢,

4

1 回答 1

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;

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

于 2014-10-08T14:41:39.350 回答