Oracle10g或以上版本。
exec dbms_stats.gather_schema_stats(ownname => 'DFMS', options => '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 ) ;
收集直方圖信息是耗費資源的,因此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]‘
只有在已有直方圖信息的列上再次收集直方圖信息。這是我們推薦設置為默認值的方式。