學習筆記-《基於Oracle的SQL優化》-第一章-1

bisal發表於2013-11-23

開始學習崔老師的《基於Oracle的SQL優化》,七百多頁,雖然可能會比較痛苦,但想必是一個痛並快樂的過程,盡情享受了。。。


第一章:Oracle裡的優化器
優化器是Oracle資料庫中內建的一個核心子系統,可以理解為一個核心模組或者一個核心功能元件。優化器的目的是按照一定的判斷原則來得到它認為的目標SQL在當前情形下最搞笑的執行路徑,也就是說,優化器的目的是為了得到目標SQL的執行計劃。

RBO內建的等級1所對應的的執行路徑就是"single row by rowid(通過rowid來訪問單行資料)"。等級15所對應的的執行路徑則是"full table scan(全表掃描)"。

等價改寫目標SQL,以讓RBO生效。
目標where條件中對NUMBER或DATE型別的列加上0(如果是VARCHAR2或CHAR型別,可以加上一個空字元,例如||''),這樣原先可以用索引的就不能用了。對於多表連線的,這種改變可以影響表連線的順序,進而使用RBO情況下對目標SQL執行計劃作調整。

若兩條或兩條以上的等級值相同的執行路徑。RBO會依據目標SQL中所涉及的相關物件在資料字典快取中的快取順序和目標SQL中所涉及的各個物件在目標SQL文字中出現的先後順序來綜合的判斷。這就意味著可以通過調整相關物件在資料字典快取中的快取中的順序,改變目標SQL中所涉及的各個物件在該SQL文字中出現的先後順序來調整其執行計劃。


RBO的缺點:
靠硬編碼在Oracle資料庫程式碼庫中的一些列固定的規則來決定目標SQL的執行計劃,並未考慮SQL中所涉及的物件的實際資料量、實際資料分佈等情況,一旦固定的規則不適用於該SQL中所涉及的實際物件時,RBO根據固定規則產生的執行計劃就很可能不是當前情況下的最優執行計劃了。

CBO:
Oracle自動計算執行路徑的成本,直到目標SQL的各個可能的執行路徑全部計算完畢或已達到預先定義好的待計算的執行路徑數量的閾值。

集的勢:
Cardinality,指指定集合所包含的記錄數。即指定結果集的行數。表示對目標SQL的某個具體執行步驟的執行結果所包含的記錄數的估算。當然,如果是針對整個目標SQL,那麼此時的Cardinality就表示對該SQL最終執行結果所包含的記錄數的估算。某個執行步驟的對應Cardinality值越大,那麼所對應的成本值往往也就越大,這個執行步驟所在執行路徑的總成本值也就會越大。

可選擇率:
Selectivity,指施加指定謂詞條件後返回結果集的記錄數佔未施加任何謂詞條件的原始結果集的記錄數的比率。
可選擇率的值越大,就意味著返回結果集的Cardinality的值就越大,所以估算出來的成本值也就會越大。


存在的問題

在做實驗的過程中碰到一個看似比較小的問題,select  * from emp where mgr=7902;,在mgr建立了索引,但未利用索引,而是使用的全表掃描,奇怪的事情,準備列印10046的trace探探究竟,後面有結果會詳細說明,也順便學習下10046的使用。

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

相關文章