Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何提高我的查询性能?/我的查询速度很慢。_Oracle_Plsqldeveloper - Fatal编程技术网

Oracle 如何提高我的查询性能?/我的查询速度很慢。

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

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 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行-这比查看要快得多: