dbms_stats包更新、导出、导入、锁定统计信息
原文轉自: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做為執行路徑。
轉載于:https://www.cnblogs.com/linbo3168/p/7279359.html
總結
以上是生活随笔為你收集整理的dbms_stats包更新、导出、导入、锁定统计信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intent实现页面跳转
- 下一篇: bzoj:1026: [SCOI2009