基于代價的優化器(cbo)在進行全表掃描時偶爾會作出一些錯誤的選擇,這種情況尤其發生在oracle7和oracle8之中。有幾種情況會導致這個問題,分別如下所示:最高使用標記(high water mark)太高:當要在一個表中進行大量的刪除時,最高使用標記可能會遠遠高于實際用到的數據塊(block)數量。因此,如果依賴于最高使用標記,cbo常常會錯誤的調用全表掃描。
錯誤的優化模式:如果optimizer_mode被設置為all_rows或者choose,那么sql優化器會更樂于使用全表掃描。如果想進行快速的oltp優化,必須首先確認已經將optimizer_mode設置成first_rows。
貧乏的統計:如果表已經顯著的增長,并且沒有被重新分析以更新統計數據,那么也許會錯誤的進行全表掃描,因為cbo認為表長還是像未增長之前那么小。
偏斜的索引:如果一個查詢中的候選索引存在偏斜值,那么cbo也許會錯誤的選擇全表掃描。例如,考慮一個查找所有滿足條件region=southern的記錄的查詢。在region欄中已經有了一個索引,但是只有1%的條目是southern region的。在缺少列的柱狀圖的情況下,cbo不知道southern region有更高的命中率,所以它會選擇全表掃描。
新聞熱點
疑難解答