與所有優化相關的統計數據,這些值與統計時聚集在桌子上不同程度的精確度的估計。因此,完全預計他們會接近但不完全準確,並且完全可能他們會瘋狂地不正確。
當您收集統計信息時,可以指定應採樣的行(或塊)的百分比。可以指定100%的樣本大小,在這種情況下,Oracle會檢查每一行,但要求樣本大小几乎相當小是相對難得的。要求更小的樣本規模(明確地或通過讓Oracle自動確定樣本規模)要高效得多。如果您的行樣本發生不包含值爲1000的一行,HIGH_VALUE
將不是1000,假設這是樣本看到的最大值,則HIGH_VALUE
將爲5。
統計數據也是一個快照。默認情況下,11g每晚都會收集自上次統計信息收集完畢後發生了足夠更改的對象的統計信息,以保證刷新統計信息,儘管您可以禁用該作業或更改參數。因此,如果您今天以100%樣本大小收集統計數據以獲得1000的HIGH_VALUE
,然後插入一行值爲3000的數據,並且絕不會再次修改表格,那麼Oracle可能永遠不會再收集該表格上的統計信息(除非你明確要求),並且HIGH_VALUE
將永遠保持1000。
假設該列上沒有柱狀圖(這是另一個完整的討論),Oracle使用LOW_VALUE
和HIGH_VALUE
來估計特定謂詞的選擇性。如果LOW_VALUE
爲1,HIGH_VALUE
是1000,有1,000,000行的表,對列沒有直方圖,和你運行像
查詢
SELECT *
FROM some_table
WHERE column_name BETWEEN 100 and 101
Oracle會猜測,數據之間均勻分佈1和1000,這樣該查詢將返回1,000行(將表中的行數(100萬)乘以查詢覆蓋範圍的一小部分(1/1000))。反過來,這種選擇性估計會促使優化器確定使用索引或執行表掃描會更有效率,使用何種聯接方法,評估各種謂詞的順序等。如果您有但是,數據的非均勻分佈可能最終會在列上出現柱狀圖,這使得Oracle可以提供有關列中數據分佈的詳細信息,而不是LOW_VALUE
和HIGH_VALUE
提供的信息。
謝謝你的回覆,我還有一個小小的跟進問題;在你的例子中,你使用了範圍謂詞(BETWEEN)。如果我有一個查詢與相等謂詞(例如:WHERE column_name = 100),那麼它不會使用HIGH_VALUE和LOW_VALUE數據我是否正確?在這種情況下,選擇性應該是1/NUM_DISTINCT?謝謝 – BYS2 2012-01-03 23:37:49
@ BYS2 - 正確,假設值介於'LOW_VALUE'和'HIGH_VALUE'之間。如果您查詢的數據超出了Oracle預期的數據範圍,則可能會將基數估計值從1 /'NUM_DISTINCT' – 2012-01-04 00:01:35
輝煌向下調整,非常感謝! – BYS2 2012-01-04 00:27:35