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列上添加索引就成功了。谢谢