【DBA】Oracle 11g 針對SQL效能的新特性(二)- Cardinality Feedback

xysoul_雲龍發表於2017-07-01
By:  Guest Author

Cardinality Feedback (CFB)

名詞

Cardinality:
    最佳化器在計算成本的時候,需要從統計資訊中取得資料,然後去估計每一步操作所涉及的行數,叫做Cardinality。
    比如,一張表T有1000行資料,列COL1上沒有直方圖,沒有空值,並且不重複的值(distinct value)有500個。那麼,在使用條件“WHERE COL1=”去訪問表的時候,最佳化器會假設資料均勻分佈,它估計出會有1000/500=2行被選出來,2就是這步操作的Cardinality。
    通常情況下,Cardinality越準確,生成的執行計劃就會越高效。

適用情況

Oracle只針對下面情況開啟CFB:
o 沒有收集表的統計資訊,並且dynamic sampling 也沒有開啟。
或者
o 查詢條件複雜(比如條件有函式)或者涉及多列,但卻沒有收集擴充套件的統計資訊(extended statistics)
在這幾種情況下,CBO是無法估算出準確的Cardinality的。

過程描述

1. 針對上述情況,Oracle會監控操作的實際行數(A-Row),然後對比CBO估算的行數(E-Row)。
2. 如果兩個值相差很大,就記錄實際行數(A-Row),做上標記。下次執行時再次進行硬解析,根據實際行數來重新生成執行計劃。
3. 如果兩個值相差不大,CBO就不再監控這條SQL語句。

驗證

如果你在執行計劃的最後看到下面這段文字,說明這個執行在生成時啟用了CFB。
Note
-----
- cardinality feedback used for this statement

禁用

如果你被這個特性困擾,那麼可以把它關閉。 具體操作請參考Note 1344937.1

參考

Cardinality Feedback - Frequently Asked Questions (Doc ID 1344937.1)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29487349/viewspace-2141457/,如需轉載,請註明出處,否則將追究法律責任。

相關文章