Oracle 如何提高我的查询性能?/我的查询速度很慢。
workitem_routing_stats表有大约1000000条记录。所有记录都已被访问,这就是我们使用完整扫描提示的原因。如果有任何方法可以优化此查询,则执行大约需要25秒Oracle 如何提高我的查询性能?/我的查询速度很慢。,oracle,plsqldeveloper,Oracle,Plsqldeveloper,workitem_routing_stats表有大约1000000条记录。所有记录都已被访问,这就是我们使用完整扫描提示的原因。如果有任何方法可以优化此查询,则执行大约需要25秒 SELECT /*+ full(wrs) */ wrs.NODE_ID, wrs.bb_id--, SUM(CASE WHEN WRS.START_TS >= (SYSTIMESTAMP-NUMTODSINTERVAL(7,'day')) AND wrs.END_TS <= SYSTIMESTAMP THE
SELECT /*+ full(wrs) */
wrs.NODE_ID,
wrs.bb_id--,
SUM(CASE WHEN WRS.START_TS >= (SYSTIMESTAMP-NUMTODSINTERVAL(7,'day'))
AND wrs.END_TS <= SYSTIMESTAMP THEN (wrs.WORKITEM_COUNT) END) outliers_last_sevend,
SUM(CASE WHEN WRS.START_TS >= (SYSTIMESTAMP-NUMTODSINTERVAL(30,'day'))
AND wrs.END_TS <= SYSTIMESTAMP THEN (wrs.WORKITEM_COUNT) END)
outliers_last_thirtyd ,
SUM(CASE WHEN WRS.START_TS >= (SYSTIMESTAMP-NUMTODSINTERVAL(90,'day'))
AND wrs.END_TS <= SYSTIMESTAMP THEN (wrs.WORKITEM_COUNT) END)
outliers_last_ninetyd ,
SUM(wrs.WORKITEM_COUNT)outliers_year
FROM workitem_routing_stats wrs
WHERE wrs.START_TS BETWEEN (SYSTIMESTAMP-numtodsinterval(365,'day')) AND SYSTIMESTAMP
AND wrs.END_TS BETWEEN (SYSTIMESTAMP-numtodsinterval(365,'day')) AND SYSTIMESTAMP
GROUP BY wrs.NODE_ID,wrs.bb_id ;
在任何情况下,全面扫描都会很痛苦 但是,如果只输入正确的数字而不是调用转换函数,则可以避免一些计算:
(SYSTIMESTAMP-numtodsinterval(365,'day'))
应该和
(SYSTIMESTAMP-365)
这将消除调用函数和解析参数字符串“day”的开销。您可以按月在START\TS列上对表进行分区。只扫描您感兴趣的年份 其次,这不是一个非常智能的解决方案,如果您的存储已满,您可以添加parallelwrs 4提示
您可以将这两件事结合起来。另一种可能性-似乎从今天起,这些数据可能会添加新的时间戳,但其余的只是历史 如果是这种情况,那么您可以添加一个汇总表来保存汇总的历史信息,并且只查询当前表中最近的内容,并将较旧的内容合并到汇总表中
然后,您将需要仔细考虑作业或其他计划过程,以填充摘要,但这将为您节省大量的查询时间。我希望numtodsinterval是确定性的,尽管我无法在文档中看到它的明确说明,并且对于每个systimestamp-x,只能计算一次,而不是每行计算一次。对于一个简单的测试用例来说似乎没有什么区别;你确定它会在这里吗?我在这里提到的表是每天只填充一个作业。是的-我的建议将进一步汇总所有100万行,减少到每天365行-这比查看要快得多: