Oracle 執行計劃 分析和動態取樣

j04212發表於2014-02-13


--分析和動態取樣
1、如果表沒有做分析,那麼CBO可以通過動態取樣的分析來獲得資料,也可以獲得正確的執行計劃;
 
注意執行計劃中的提示,這表示使用了動態取樣
Note
----
  - dynamic sampling used for this statement


2、如果表分析過,但是分析資訊過舊,這時候CBO就不會再使用動態取樣,而是使用這些舊的分析資料,從而可能導致錯誤的執行計劃。

做sql執行計劃的時候最好分析下資料(例如對t表)

IKKI@ test10g> exec dbms_stats.gather_table_stats(user,'t',cascade=>true);

PL/SQL procedure successfully completed.


是否對錶進行了分析,可以通過下面的語句查詢,如果結果為空,說明沒有對錶進行分析。

IKKI@ test10g> select num_rows, avg_row_len, blocks, last_analyzed
               from user_tables
               where table_name='T';

  NUM_ROWS AVG_ROW_LEN     BLOCKS LAST_ANALYZE
---------- ----------- ---------- ------------


是否對錶的索引進行了分析,可以用以下的語句查詢。

IKKI@ test10g> select blevel, leaf_blocks, distinct_keys, last_analyzed   
               from user_indexes
               where table_name='T';


什麼時候使用動態取樣?

動態取樣需要額外的消耗資料庫資源,所以在這樣一個環境中:sql被反覆執行,變數被繫結,硬分析很少,是不宜用動態取樣的,就像 OLTP 系統。動態取樣發生在硬分析時,如果很少有硬分析發生,動態取樣的意義就不大。

而 OLAP 或資料倉儲環境下,sql的執行消耗的資源要遠遠大於sql解析,那麼讓解析再消耗多一點資源做一些動態取樣分析,從而做出一個最優的執行計劃是非常值得的。實際上在這樣的環境下,硬分析消耗的資源幾乎是可以忽略的。

建議,在 OLAP 或者資料倉儲環境中,將動態取樣的 level 設定為3 或4比較好;相反,在一個 OLTP 系統下,不應該使用動態取樣。

 

 

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

相關文章