0

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 ;
4

3 回答 3

1

您可以按月在 START_TS 列上对表进行范围分区。(将仅扫描您感兴趣的年份)

其次(不是一个非常智能的解决方案)如果您的存储功能强大,您可以添加并行(wrs 4)提示。

你可以把这两件事结合起来。

于 2012-09-05T13:17:40.973 回答
0

另一种可能性 - 似乎这些数据可能会从今天开始添加新的时间戳,但其余的只是历史......

如果是这种情况,那么您可以添加一个汇总表来保存汇总的历史信息,并仅在当前表中查询最近的内容,并在汇总表中查询较旧的内容。

然后,您将需要仔细考虑 JOB 或其他预定流程以获取汇总信息,但这会在此查询时间内为您节省大量时间。

于 2012-09-05T14:11:59.930 回答
0

无论如何,全面扫描会很痛苦......

但是 - 如果您只是输入正确的数字而不是调用转换函数,您可能会避免一些计算:

(SYSTIMESTAMP-numtodsinterval(365,'day')) 

应该与

(SYSTIMESTAMP-365) 

这应该消除调用函数和解析参数字符串('day')的开销

于 2012-09-05T12:37:14.253 回答