手工收集統計資訊及立即產生新的執行計劃

lusklusklusk發表於2016-06-15

實際工作上用的較多的就是臨時手工收集下某張表的統計資訊並希望後續sql立即生成新的執行計劃。方法有如下兩種,推薦用dbms_stats,遇到CHAINED ROWSCLUSTER TABLE就必須使用analyze,且analyze不受任何引數限制執行後立即會清除shared pool中該物件的遊標,而dbms_stats則受引數控制。

 

生產環境上是不可能去執行alter system flush shared_pool以便讓sql立即生成新的執行計劃的

 

 

一:SQL> analyze table my_table compute statistics;

analyze table 一般可以指定分析表、所有欄位、所有索引欄位、所有索引。 若不指定則全部都分析。

上面語句等價於:

SQL> analyze table my_table compute statistics for table for all indexes for all columns;

 

二:SQL>exec dbms_stats.gather_table_stats('HR','T1',cascade=>true, no_invalidate=>FALSE);

Cascade選項:預設值是DBMS_STATS.AUTO_CASCADE。手工操作時一般時候設定為true,把索引也收集了

no_invalidate選項:預設值是DBMS_STATS.AUTO_INVALIDATE。手工操作時一般時候設定為false,讓之後的sql立即生成新的執行計劃。

true:當收集完統計資訊後,收集物件的cursor不會失效(不會產生新的執行計劃,子游標)
false:
當收集完統計資訊後,收集物件的cursor會立即失效(新的執行計劃,新的子游標)
DBMS_STATS.AUTO_INVALIDATE:
收集後,收集物件的cursor在一段時間後失效,時間受引數_optimizer_invalidation_period控制,預設是18000秒即5小時





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

相關文章