在previous question我評論有關甲骨文公司的統計數據:Oracle如何使用統計數據
Oracle不知道50M比行數量。當然,它有統計數據,但它們可能是老的和錯誤的 - 而且Oracle不會因爲統計數據錯誤而導致錯誤的結果
我非常肯定Oracle在準備查詢執行時依賴統計信息計劃。在版本10之前,建議不時刷新統計信息,並從Oracle 10g自動收集統計信息。
有人可以解釋有多少Oracle查詢分析器依賴於統計數據嗎?
在previous question我評論有關甲骨文公司的統計數據:Oracle如何使用統計數據
Oracle不知道50M比行數量。當然,它有統計數據,但它們可能是老的和錯誤的 - 而且Oracle不會因爲統計數據錯誤而導致錯誤的結果
我非常肯定Oracle在準備查詢執行時依賴統計信息計劃。在版本10之前,建議不時刷新統計信息,並從Oracle 10g自動收集統計信息。
有人可以解釋有多少Oracle查詢分析器依賴於統計數據嗎?
Oracle使用統計很多,生成查詢執行計劃。它沒有(也不應該)做的是以影響查詢結果的方式使用這些統計數據,這是您嘗試使用「ROWNUM < 50000000」所做的。統計信息可能已過時或缺失。但是,這隻會意味着Oracle可能會生成正確結果的速度較慢,但這並不意味着Oracle將返回錯誤的結果。
如果Oracle按照您的希望工作,那麼即使該表現在包含60,000,000行(但包含過時的統計數據表明它只包含49,000,000),它可能會決定「ROWNUM < 50000000」意味着「獲取所有行」。幸運的是,它沒有。
統計信息對查詢優化器非常重要。他們應該定期自動或手動收集。
執行查詢時,Oracle會生成一個可用執行計劃的池,以滿足您的查詢。這些執行計劃從他們將返回相同的確切結果的角度來看是相同的,這只是一條通往另一個計劃的道路。爲了確定這種效率,Oracle使用在每個執行計劃中使用的對象上生成的統計信息來確定其各自的成本。如果這些統計數據不存在或者陳舊,那麼與每個計劃相關的成本將不太準確,因此可能不會選擇最優方案。
下面是一些Oracle使用確定這個成本的關鍵統計數據的:
表統計
* Number of rows * Number of blocks * Average row length
列統計
* Number of distinct values (NDV) in column * Number of nulls in column * Data distribution (histogram) * Extended statistics
指數統計
個* Number of leaf blocks * Levels * Clustering factor
系統統計
* I/O performance and utilization * CPU performance and utilization
統計數據用於由Oracle基於成本的優化器(CBO)來計算的執行,使得最合適的一個,可以選擇一個查詢的不同的方式的相對成本。
總的來說,這項工作非常好,並且正在不斷改進。例如,在11g中,您可以收集多列直方圖,這些直方圖對查詢具有相關列上的謂詞有很大幫助(例如像出生月份和星號那樣強相關,或者像性別和身高那樣更弱地糾正)。
然而它並不完美。例如,估計兩個表之間連接的結果集的基數是相當準確的,就像估計來自過濾器操作的基數一樣,但是將兩者結合需要很多估計,這很容易是不準確的。在某些情況下,這些問題可以通過提示或針對中間結果集使用全局臨時表來解決。
統計的另一個問題是,改變它們可以改變執行計劃,所以最近有更多的運動要麼阻止持續收集統計數據,要麼在實施統計之前分析統計變化的影響。
尋找喬納森劉易斯的書 - 這是一個非常徹底的治療主題。
請注意,11g引入了SQL計劃管理,以基於新統計信息啓用對執行計劃更改的更大控制。您現在可以有效地鎖定執行計劃,以便即使基於成本找到更好的計劃,也可以使用它。 DBA可以通過企業管理器查看並允許使用這些執行計劃。這允許持續收集統計數據,同時控制數據庫中關鍵表上與它們相關的變化。 – 2009-12-02 20:02:15
是的,這是一個很好的功能。 – 2009-12-03 07:41:32
這就是我在問題中引用評論時的意思。 – 2009-12-02 13:37:35