ORACLE用ORDERED提示改變SQL執行計劃 【轉】,解決Oracle查詢卡死問題,優化查詢語句。...

     之前在公司開發內部信息化系統,碰到了一個很悲劇事情。項目在測試環境運行沒問題,上到正式環境,訪問就卡住不動了。檢查才發現那條查詢的SQL的問題。因爲一條SQL涉及了十幾張表,left join的,inner join的,多表查詢的,各種關聯交雜在一起,整條SQL語句二三十行,放到plsql裏面整整一頁。可能由於這種關聯性的東西太多,導致數據庫執行查詢的時候出現卡死的情況。測試環境的數據庫是從正式環境中備份過去的,數據是一樣的,而且都是同一臺服務器的oracle,但實例名是不同的。最後使用了添加 /*+ ordered */  解決了查詢卡死的問題。

 

     ORDERED提示強制Oracle按照From子句中表出現的順序進行表連接。

     通過ORDERED提示,可以避免CBO SQL解析過程中的表連接評估,從而避免Oracle產生錯誤的執行計劃,或者強制Oracle按照我們指定的方式執行。在很多時候,當我們清楚地瞭解數據結構和數據分佈之後,就可以通過ORDERED提示來提高SQL性能。

     如下例:

SELECT /*+ ordered */ COUNT (*)
FROM t_middle, t_small, t_max
WHERE t_small.object_id = t_middle.object_id
AND t_middle.object_id = t_max.object_id;

 

最後發現數據庫查詢優化的問題,

where …… and    rl.date_value >= to_date(tt.month,'yyyy-MM') and rl.date_value < add_months(to_date(tt.month,'yyyy-MM'),1)  ……

  

where …… and    to_char(rl.date_value,'yyyy-mm') = tt.month ……

 上面和下面這兩天sql語句都是查詢rl.date_value的時間在tt.month這個月份所有有關記錄。。

通過大於或等於第一天並且小於第二個月的最後一天的這種方式,性能消耗極大。用第二種方式時間節省3倍以上。本來執行需要10秒多,修正後,大約一秒多就OK了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章