這對我來說是一個重新發生的問題。我有一段時間運行良好的表述,一段時間後優化器決定選擇另一個執行計劃。這甚至發生在我查詢一個(複合)主鍵時。爲什麼優化器選擇成本更高的執行計劃?
當我在dba_hist_sql_plan中查找執行計劃時,使用主鍵索引顯示成本爲20,查詢執行全表掃描的成本爲270。
plan_hash_value Operation Options Cost Search_Columns
2550672280 0 SELECT STATEMENT 20
2550672280 1 PARTITION HASH SINGLE 20
2550672280 2 TABLE ACCESS BY LOCAL INDEX ROWID 20
2550672280 3 INDEX RANGE SCAN 19 1
3908080950 0 SELECT STATEMENT 270
3908080950 1 PARTITION HASH SINGLE 270
3908080950 2 TABLE ACCESS FULL 270
我已經注意到,優化器僅使用在主鍵索引中的第一列,然後再執行範圍掃描。但我真正的問題是:爲什麼優化器選擇成本更高的執行計劃?這不是兩個執行計劃同時使用,我注意到一個快照內的交換機,然後它保持這樣的幾個小時/天。所以它不能成爲綁定窺視的問題。
我們目前的解決方案是,我打電話給我們的DBA,並刷新語句緩存。但這不是真正可持續的。
編輯: SQL看起來像這樣:select * from X where X.id1 =?和X.id2 =?和X.id3 =? 與(id1,id2,id3)是表上的複合主鍵(具有唯一索引)。
可能有很多原因。其中一些是有效的。最常見的一個是當exec。計劃適用於其他模式。另一個原因可以是動態採樣或性能基準。 – ibre5041
SQL在哪裏?你看**自適應光標共享**嗎? –
SQL很簡單。像「select * from x where x.id1 =?and x.id2 =?and x.id3 =?」 – EasterBunnyBugSmasher