天天看點

讀書筆記-《基于Oracle的SQL優化》-第一章-1

開始學習崔老師的《基于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的使用。