Oracle 11g SQL效能的新特性(二)- Cardinality Feedback

pxbibm發表於2015-02-05

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


禁用



如果你被這個特性困擾,那麼可以把它關閉。

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

相關文章