dbms_stats包更新、导出、导入、锁定统计信息
原文轉(zhuǎn)自:http://www.cnblogs.com/zhaoguan_wang/p/5126629.html
dbms_stats包問世以后,我們可通過一種新的方式來為CBO收集統(tǒng)計數(shù)據(jù)。目前,已經(jīng)不再推薦使用老式的Analyze分析表和dbms_utility方法來生成CBO統(tǒng)計數(shù)據(jù)。dbms_stats能良好地估計統(tǒng)計數(shù)據(jù)(尤其是針對較大的分區(qū)表),并能獲得更好的統(tǒng)計結(jié)果,最終制定出速度更快的SQL執(zhí)行計劃
1 --創(chuàng)建用于存放統(tǒng)計信息的舞臺表 2 3 exec dbms_stats.create_stat_table (ownname => 'SCOTT', stattab => 'ST_T1', tblspace => 'TBS1'); 4 5 --刪除存放統(tǒng)計信息的指定舞臺表 6 exec DBMS_STATS.DROP_STAT_TABLE('scott', 'ST_T1');--使用export_table_stats過程導(dǎo)出統(tǒng)計信息,此時statid為T1_20160101?????
exec dbms_stats.export_table_stats(ownname =>'SCOTT', tabname=>'T1', stattab=>'ST_T1', statid => 'T1_20160101');--使用import_table_stats導(dǎo)入之前過舊的統(tǒng)計信息(可以指定新的ownname)??
1 exec dbms_stats.import_table_stats(ownname =>'SCOTT', tabname=>'T1', stattab=>'ST_T1', statid => 'T1_20160101', no_invalidate => true);統(tǒng)計信息加鎖/解鎖
1 --鎖住表的統(tǒng)計信息 2 exec dbms_stats.lock_table_stats('SCOTT','T1'); 3 --解鎖表的統(tǒng)計信息 4 exec dbms_stats.unlock_table_stats('SCOTT','T1');更新schema或table的統(tǒng)計信息:
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在收集統(tǒng)計數(shù)據(jù)時指定具體的采樣比例,缺省是100???? 一個新的參數(shù),自動估計要采樣的一個segment的最佳百分比:estimate_percent => dbms_stats.auto_sample_size? 在使用自動采樣時,Oracle會為一個樣本尺寸選擇5到20的百分比。
method_opt選項?? 為了智能地生成直方圖,Oracle為dbms_stats準(zhǔn)備了method_opt參數(shù)。在method_opt子句中,還有一些重要的新選項,包括skewonly,repeat和auto:?? method_opt=>'for all columns size skewonly'? -- skewonly選項會耗費大量處理時間,因為它要檢查每個索引中的每個列的值的分布情況。?? method_opt=>'for all columns size repeat'????? -- 只會為現(xiàn)有的直方圖重新分析索引,不再搜索其他直方圖機(jī)會。定期重新分析統(tǒng)計數(shù)據(jù)時,你應(yīng)該采取這種方式。?? method_opt=>'for all columns size auto'???????? -- 根據(jù)數(shù)據(jù)分布以及應(yīng)用程序訪問列的方式來創(chuàng)建直方圖(例如使用alter table xxx monitoring; 命令監(jiān)視表時,使用auto選項)??
并行收集?? Oracle允許以并行方式來收集CBO統(tǒng)計數(shù)據(jù),這就顯著提高了收集統(tǒng)計數(shù)據(jù)的速度。但是,要想并行收集統(tǒng)計數(shù)據(jù),你需要一臺安裝了多個CPU的SMP服務(wù)器。gather_schema_stats 的 options參數(shù)?? 使用4個預(yù)設(shè)的方法之一,這個選項能控制Oracle統(tǒng)計的刷新方式: ?? gather——重新分析整個架構(gòu)(Schema)。 ?? gather empty——只分析目前還沒有統(tǒng)計的表。 ?? gather stale——只重新分析修改量超過10%的表(這些修改包括插入、更新和刪除)。 ?? gather auto——重新分析當(dāng)前沒有統(tǒng)計的對象,以及統(tǒng)計數(shù)據(jù)過期(變臟)的對象。注意,使用gather auto類似于組合使用gather stale和gather empty。?? 注意,無論gather stale還是gather auto,都要求進(jìn)行監(jiān)視。如果你執(zhí)行一個alter table xxx monitoring命令,Oracle會用dba_tab_modifications視圖來跟蹤發(fā)生變動的表。這樣一來,你就確切地知道,自從上一次分析統(tǒng)計數(shù)據(jù)以來,發(fā)生了多少次插入、更新和刪除操作。
也有提到關(guān)于索引統(tǒng)計信息收集的負(fù)面影響,索引方面建議直接使用? alter index idx_name rebuild nologging;?? 與analyze相比dbms_stats具有很多優(yōu)勢,比如并行,比如分區(qū)信息統(tǒng)計等,但是dbms_stats在分析index的時候處理方式并不是太理想,dbms_stats分析 index時將會只統(tǒng)計leaf_blocks為當(dāng)前有數(shù)據(jù)的 leaf block,而analyze則會統(tǒng)計為所有曾經(jīng)被使用過的 leaf block number,很顯然dbms_stats的統(tǒng)計結(jié)果會使 index fast full scan的成本被嚴(yán)重低估,在某些情況下會錯誤得選擇 index fast full scan做為執(zhí)行路徑。
轉(zhuǎn)載于:https://www.cnblogs.com/linbo3168/p/7279359.html
總結(jié)
以上是生活随笔為你收集整理的dbms_stats包更新、导出、导入、锁定统计信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intent实现页面跳转
- 下一篇: bzoj:1026: [SCOI2009