2012-09-05 30 views
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 ; 

回答

0

完全掃描將是在任何情況下痛苦...

但是 - 你可能會避免一些計算,如果你只是把正確的號碼,而不是調用轉換功能:

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

應該只是同

(SYSTIMESTAMP-365) 

這應該刪除調用的開銷解析參數字符串('day')

+0

我期望'numtodsinterval'是確定性的(儘管我看不出它在文檔中明確指出),並且每個「systimestamp -x」只能計算一次,而不是每行一次。似乎無論如何對一個簡單的測試案例都沒有影響;你確定它會在這裏嗎? –

+0

nope - 不確定。 – Randy

1

您可以在START_TS列中按月對錶格進行分區。 (只會掃描你感興趣的年份)

其次(不是一個非常聰明的解決方案),如果你的存儲功能強大,你可以添加一個並行(4個提示)提示。

你可以結合這兩件事情。

0

另一個可能性 - 似乎,也許這數據將增加新的時間戳截至今日,但剩下的只是歷史...

,如果是這樣的話,那麼你可以彙總表添加到保留彙總的歷史信息,並僅查詢當前表格中的近期內容,並將UNION更新到舊錶格中。

然後,您將需要考慮通過JOB或其他計劃過程來獲取摘要填充,但在此查詢時間內將節省大量的時間。

+0

我在這裏提到的表格僅在日常工作中被工作人員填充。 – Bhagwat

+0

是的 - 我的建議會進一步總結所有100萬行,每天減少到一個(365) - 這要快得多:) – Randy