Sql 优化子select语句以减少获取时间

Sql 优化子select语句以减少获取时间,sql,oracle,select,Sql,Oracle,Select,我有一个问题 select * from (select a.*, /*+ FIRST_ROWS(10) */ rownum rnum from (SELECT AL.AL_UID, AL.TP_ID, AL.EVENTDATE, TP.NAME, AL.EVENT, AL.FILE_NAME, AL.NOTES, AL.XU_NAME, AL.STATUS, AL.LOG_SOURCE, rownum FROM AUDITLOG AL,

我有一个问题

select * from 
(select a.*, /*+ FIRST_ROWS(10) */ rownum rnum 
 from (SELECT AL.AL_UID, AL.TP_ID, AL.EVENTDATE, TP.NAME, AL.EVENT, AL.FILE_NAME,
              AL.NOTES, AL.XU_NAME, AL.STATUS, AL.LOG_SOURCE, rownum
       FROM AUDITLOG AL,
            TRADINGPARTNER TP 
       WHERE  ( AL.LOG_SOURCE = 'File Deployment' )  AND TP.ID = AL.TP_ID 
       ORDER BY AL.EVENTDATE desc, AL.AL_UID desc
      ) a
 where rownum < 101
) 
where rnum > 0;

获取结果大约需要一分钟的时间。请让我知道如何优化它,以减少获取时间。我可以在这里使用联接吗?

关于日志源、EVENTDATE desc、AL\u UID desc的索引值得一看-可能不需要desc子句,如果可能,尽量不要使用它们


我会将第一行提示放在与谓词和order相同的查询块中。

窗口函数通常比order by快。您可以尝试以下方法:

select *
from (SELECT AL.AL_UID, AL.TP_ID, AL.EVENTDATE, TP.NAME, AL.EVENT, AL.FILE_NAME,
             AL.NOTES, AL.XU_NAME, AL.STATUS, AL.LOG_SOURCE,
             ROW_NUMBER() over (order by AL.EVENTDATE desc, AL.AL_UID desc) as seqnum
      FROM AUDITLOG AL join
           TRADINGPARTNER TP 
           on TP.ID = AL.TP_ID
      WHERE AL.LOG_SOURCE = 'File Deployment'
     ) t
where seqnum between 1 and 100;
有了它,您实际上可以这样写:

select al.*, TP.name
from (SELECT AL.AL_UID, AL.TP_ID, AL.EVENTDATE, AL.EVENT, AL.FILE_NAME,
             AL.NOTES, AL.XU_NAME, AL.STATUS, AL.LOG_SOURCE,
             ROW_NUMBER() over (order by AL.EVENTDATE desc, AL.AL_UID desc) as seqnum
      FROM AUDITLOG AL
      WHERE AL.LOG_SOURCE = 'File Deployment'
     ) al join
     TradingPartner tp
     on TP.ID = AL.TP_ID 
where seqnum between 1 and 100;

很明显,AuditLogEventdate上的索引将大大提高性能。

您真正想要的是什么输出?是否要所有列?如果可能的话,请告诉我们您想要的输出。您不能只有一个子查询而不是两个子查询吗?其中rownum<101和rnum>0应该起到关键作用否?事实上,我认为不需要任何子查询。此外,log_source上的索引可能会有所帮助。@DanBracuk:where子句在order by之前求值,因此必须有一级子查询以确保在按行号筛选之前应用order by-请参阅。感谢您的解释。在审计日志表的EVENT_DATE列上添加索引就成功了。谢谢