1. 程式人生 > >dbms_stats包更新、導出、導入、鎖定統計信息

dbms_stats包更新、導出、導入、鎖定統計信息

但是 超過 rac monit empty 包括 invalid 情況 space

原文轉自:http://www.cnblogs.com/zhaoguan_wang/p/5126629.html

dbms_stats包問世以後,我們可通過一種新的方式來為CBO收集統計數據。目前,已經不再推薦使用老式的Analyze分析表和dbms_utility方法來生成CBO統計數據。dbms_stats能良好地估計統計數據(尤其是針對較大的分區表),並能獲得更好的統計結果,最終制定出速度更快的SQL執行計劃

1 --創建用於存放統計信息的舞臺表    
2 
3 exec dbms_stats.create_stat_table (ownname => SCOTT, stattab =>
ST_T1, tblspace => TBS1); 4 5 --刪除存放統計信息的指定舞臺表 6 exec DBMS_STATS.DROP_STAT_TABLE(scott, ST_T1);

--使用export_table_stats過程導出統計信息,此時statid為T1_20160101

exec dbms_stats.export_table_stats(ownname =>SCOTT, tabname=>T1, stattab=>ST_T1, statid => T1_20160101);

--使用import_table_stats導入之前過舊的統計信息(可以指定新的ownname)

1    exec dbms_stats.import_table_stats(ownname =>SCOTT,  tabname=>T1,  stattab=>ST_T1, statid => T1_20160101, no_invalidate => true); 

統計信息加鎖/解鎖

1 --鎖住表的統計信息
2 exec dbms_stats.lock_table_stats(SCOTT,T1); 
3 --解鎖表的統計信息
4 exec dbms_stats.unlock_table_stats(SCOTT,T1); 

更新schema或table的統計信息:

1 exec dbms_stats.gather_schema_stats(     ownname => SCOTT,        options => GATHER AUTO,        estimate_percent => dbms_stats.auto_sample_size,        method_opt => for all columns size repeat,        degree => 8    );
2 
3 
4 EXEC DBMS_STATS.gather_table_stats(       ownname => socct,      tabname =>T1,        estimate_percent =>100,        method_opt => for all columns size auto,       cascade =>true,      degree => 8   );

estimate_percent選項 它允許Oracle的dbms_stats在收集統計數據時指定具體的采樣比例,缺省是100 一個新的參數,自動估計要采樣的一個segment的最佳百分比:estimate_percent => dbms_stats.auto_sample_size 在使用自動采樣時,Oracle會為一個樣本尺寸選擇5到20的百分比。

method_opt選項 為了智能地生成直方圖,Oracle為dbms_stats準備了method_opt參數。在method_opt子句中,還有一些重要的新選項,包括skewonly,repeat和auto: method_opt=>‘for all columns size skewonly‘ -- skewonly選項會耗費大量處理時間,因為它要檢查每個索引中的每個列的值的分布情況。 method_opt=>‘for all columns size repeat‘ -- 只會為現有的直方圖重新分析索引,不再搜索其他直方圖機會。定期重新分析統計數據時,你應該采取這種方式。 method_opt=>‘for all columns size auto‘ -- 根據數據分布以及應用程序訪問列的方式來創建直方圖(例如使用alter table xxx monitoring; 命令監視表時,使用auto選項)
並行收集 Oracle允許以並行方式來收集CBO統計數據,這就顯著提高了收集統計數據的速度。但是,要想並行收集統計數據,你需要一臺安裝了多個CPU的SMP服務器。gather_schema_stats 的 options參數 使用4個預設的方法之一,這個選項能控制Oracle統計的刷新方式: gather——重新分析整個架構(Schema)。 gather empty——只分析目前還沒有統計的表。 gather stale——只重新分析修改量超過10%的表(這些修改包括插入、更新和刪除)。 gather auto——重新分析當前沒有統計的對象,以及統計數據過期(變臟)的對象。註意,使用gather auto類似於組合使用gather stale和gather empty。 註意,無論gather stale還是gather auto,都要求進行監視。如果你執行一個alter table xxx monitoring命令,Oracle會用dba_tab_modifications視圖來跟蹤發生變動的表。這樣一來,你就確切地知道,自從上一次分析統計數據以來,發生了多少次插入、更新和刪除操作。

也有提到關於索引統計信息收集的負面影響,索引方面建議直接使用 alter index idx_name rebuild nologging; 與analyze相比dbms_stats具有很多優勢,比如並行,比如分區信息統計等,但是dbms_stats在分析index的時候處理方式並不是太理想,dbms_stats分析 index時將會只統計leaf_blocks為當前有數據的 leaf block,而analyze則會統計為所有曾經被使用過的 leaf block number,很顯然dbms_stats的統計結果會使 index fast full scan的成本被嚴重低估,在某些情況下會錯誤得選擇 index fast full scan做為執行路徑。

dbms_stats包更新、導出、導入、鎖定統計信息