從Oracle 10g開始,Optimizer(最佳化處理程式)預設採用CBO(Cost Based Optimizer)模式。最佳化處理程式需要Table(表格)的statistics(統計資料)找出成本最低的Execution plan(執行計畫),因此統計資料的正確性對執行計畫的選擇扮演相當重要的角色。雖然Oracle 10g開始有自動收集統計資料的Job(工作),將會在每天晚上與週六日自動執行統計資料收集作業。但是還是有些表格剛剛建立時,並沒有統計資料存在。因此Oracle資料庫藉由optimizer_dynamic_sampling參數,讓最佳化處理程式遇到沒有統計資料存在的表格時,可以動態地使用抽樣的方式得到統計資料,讓最佳化處理程式得以正確地找到執行成本相對低的執行計畫。
optimizer_dynamic_sampling的參數值為整數,可由0到10。
以下針對每個參數值進行說明:
- 0 => 表示關閉動態抽樣收集,讓最佳化處理程式使用Data Dictionary(資料辭典的內容(如表格所被配置的extent個數與表格欄位個數與資料形態等)計算可能的統計資料。
- 1 => SQL敘述句(Statement)所使用到的所有表格都沒有統計資料存在,而且滿足下列4個條件時,最佳化處理程式便可以藉由抽樣其中32個區塊(block),取得表格的統計資料。
- 條件1.SQL敘述句中,至少有一個表格沒有統計資料,且該表格不是partitioned table。
- 條件2.該表格(滿足條件1的表格)與其他表格結合(join)或位在子查詢內(subquery)或在不可合併的視觀表內(non-mergeable view)。
- 條件3.該表格(滿足條件2的表格)沒有索引存在。
- 條件4.該表格(滿足件3的表格)的區塊數量大於32個。
- 2 => SQL敘述句所使用的表格,至少有一個表格沒有統計資料。但抽樣的資料區塊個數為64個。
- 3 => 滿足optimizer_dynamic_sampling=2的所有條件,且SQL敘述句中有至少一個運算式(expression:例如where last_name='King')。
此時將抽樣64個資料區塊當作分析統計的基準。
- 4 => 滿足optimizer_dynamic_sampling=3的所有條件,且SQL敘述句中對同一個table使用多個述詞(predicate:例如where last_name='King' and salary>10000)
此時將抽樣32個資料區塊當作分析統計的基準。
- 5 => 滿足optimizer_dynamic_sampling=4的要求,但抽樣的資料區塊數量為2倍的預設區塊數量(32),即使用64個區塊。
- 6 => 滿足optimizer_dynamic_sampling=5的要求,但抽樣的資料區塊數量為4倍的預設區塊數量(32),即使用128個區塊。
- 7 => 滿足optimizer_dynamic_sampling=6的要求,但抽樣的資料區塊數量為8倍的預設區塊數量(32),即使用256個區塊。
- 8 => 滿足optimizer_dynamic_sampling=7的要求,但抽樣的資料區塊數量為32倍的預設區塊數量(32),即使用1024個區塊。
- 9 => 滿足optimizer_dynamic_sampling=8的要求,但抽樣的資料區塊數量為128倍的預設區塊數量(32),即使用4096個區塊。
- 10 => 對所有滿足optimizer_dynamic_sampling=9的表格,使用整個表格所有的區塊進行分析。
|