Optimizer_Dynamic_Sampling 參數說明

作  者:申建忠 精誠資訊 恆逸教育訓練中心 資深講師
技術分類:資料庫
 

從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. 條件1.SQL敘述句中,至少有一個表格沒有統計資料,且該表格不是partitioned table。
    2. 條件2.該表格(滿足條件1的表格)與其他表格結合(join)或位在子查詢內(subquery)或在不可合併的視觀表內(non-mergeable view)。
    3. 條件3.該表格(滿足條件2的表格)沒有索引存在。
    4. 條件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的表格,使用整個表格所有的區塊進行分析。
 
Share |

您可在課程中了解更多的技術…

相關學習資源︰