exec dbms_stats.gather_schema_stats 手動優化統計[final]

tolywang發表於2009-04-23


Oracle10g或以上版本。

exec dbms_stats.gather_schema_stats(ownname => 'DFMS', ptions => 'GATHER AUTO',
estimate_percent => dbms_stats.auto_sample_size,  -- -- 11g取樣值比較大,可以使用samplesize,10g好像是5~20%,可以根據需要調整 
method_opt => 'for all columns size auto', -- 一般第一次收集的時候使用 'for all columns size 1' 刪除所有列上的直方圖,之後可以使用 size auto , 逐漸調整,穩定後推薦使用 'for all columns size repeat'
cascade=>TRUE,
degree => 8 ) ;


轉帖自: http://www.dbform.com/html/category/oracledb/page/6
...

收集直方圖資訊是耗費資源的,因此SKEWONLY不推薦使用。實際上經歷了這麼多版本,SKEWONLY的演算法一直很奇怪,我沒有找到一份文件描述Oracle到底是如何定義SKEWONLY的收集憑據的。
 
method_opt=>’for columns size auto [column_name]‘
 什麼是AUTO?再看一下Oracle官方文件中的定義。
 

Oracle determines the columns to collect histograms based on data distribution and the workload of the columns.
 
也就是在SKEWONLY的基礎上額外增加了workload限制,何謂workload?實際上就是我們前面提到的是否在where條件中出現。如果一個列從來沒有出現在where條件中,Oracle就認為是沒有workload的,那麼即使此列上的資料被認為是SKEW的,也不會收集直方圖資訊,只有出現過至少一次,Oracle才會收集。[via Comment by Dbsnake] 該workload資訊可以從資料字典COL_USAGE$中獲得,在資料字典中存在的列才是有workload的。


因此AUTO也是有問題的,N2欄位上的直方圖資訊仍然會收集,這是我們不需要的。注意,在Oracle10g之後的自動統計資訊收集任務中,預設的是FOR ALL COLUMNS SIZE AUTO,這是很有問題的,因此即使是不禁用自動統計資訊收集,也應該通過DBMS_STATS.SET_PARAM儲存過程(在11gR2版本中被SET_GLOBAL_PREFS儲存過程替代)來修改該預設值。通常我們經歷的執行計劃莫名其妙改變,很多場合都是因為Oracle10g之後的這個統計資訊自動收集任務導致的。關於自動統計資訊收集,可以參看:Automatic Statistics Gathering
method_opt=>’for columns size repeat [column_name]‘
 只有在已有直方圖資訊的列上再次收集直方圖資訊。這是我們推薦設定為預設值的方式。

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

相關文章