oracle 数据统计收集,Oracle 10g收集数据库统计信息
1.需求概述
某數(shù)據(jù)庫由于整體統(tǒng)計信息不準(zhǔn)確,多次出現(xiàn)部分業(yè)務(wù)SQL選錯執(zhí)行計劃,從而導(dǎo)致性能下降影響到最終用戶體驗,目前通過SQL_PROFILE綁定執(zhí)行計劃臨時解決,但此方法不夠靈活,后續(xù)維護工作量也會增加。
Oracle優(yōu)化器(CBO)依賴數(shù)據(jù)庫統(tǒng)計信息來計算目標(biāo)SQL各種可能的執(zhí)行路徑的成本,并從中選擇一條成本值最小的執(zhí)行路徑來作為目標(biāo)SQL的執(zhí)行計劃。如果統(tǒng)計信息不準(zhǔn)確甚至是錯誤,會導(dǎo)致優(yōu)化器選擇錯誤SQL執(zhí)行計劃的概率大大增加。
目前計劃對該數(shù)據(jù)庫統(tǒng)計信息進行重新收集,因為生產(chǎn)環(huán)境的復(fù)雜性,不排除重新收集正確的統(tǒng)計信息后,整體性能反而下降的情況。故而在收集之前需要對原有的統(tǒng)計信息做好備份,如發(fā)現(xiàn)收集后性能反而下降的極端情況,也可以快速回退到原有的統(tǒng)計信息。
2.實施步驟
2.1備份當(dāng)前數(shù)據(jù)庫統(tǒng)計信息
備份當(dāng)前數(shù)據(jù)庫的統(tǒng)計信息,建議備份后再導(dǎo)出一份留存:
--備份當(dāng)前數(shù)據(jù)庫的統(tǒng)計信息:
begin
DBMS_STATS.CREATE_STAT_TABLE('SYSTEM','DB_STATS_20190118');
DBMS_STATS.EXPORT_DATABASE_STATS(STATTAB => 'DB_STATS_20190118', STATOWN => 'SYSTEM');
end;
/
--備份后再導(dǎo)出一份留存
expdp \'/ as sysdba\' directory=DATA_PUMP_DIR dumpfile=stats.dmp logfile=stats.log tables=system.db_stats_20190118
2.2收集數(shù)據(jù)庫統(tǒng)計信息
收集數(shù)據(jù)庫的統(tǒng)計信息,需要在業(yè)務(wù)閑時操作:
--開啟計時
set timing on
--開始收集全庫統(tǒng)計信息
begin
dbms_stats.gather_database_stats(
ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => 'for all indexed columns', cascade=>true, degree=>16);
end;
/
注意:degree的值并不是設(shè)置越高就越快,同時要根據(jù)實際CPU具體情況來設(shè)置。
如果數(shù)據(jù)庫是11.2.0.2及以上版本,還可以通過DBMS_STATS.SET_GLOBAL_PREFS設(shè)置并發(fā)收集進一步提升收集效率,具體可參考:
3.回退方案
3.1正常回退
收集統(tǒng)計信息后發(fā)現(xiàn)性能大幅下降,正常回退,直接將原統(tǒng)計信息導(dǎo)入:
--正常回退,直接將原統(tǒng)計信息導(dǎo)入:
exec DBMS_STATS.IMPORT_DATABASE_STATS (STATTAB => 'DB_STATS_20190118', STATOWN => 'SYSTEM');
3.2其他情況
如果DB_STATS_20190118被損壞,可以刪除后使用之前的備份導(dǎo)入:
--刪除DB_STATS_20190118:
exec DBMS_STATS.DROP_STAT_TABLE ('SYSTEM','DB_STATS_20190118');
--使用之前的備份導(dǎo)入DB_STATS_20190118:
impdp \'/ as sysdba\' directory=DATA_PUMP_DIR dumpfile=stats.dmp logfile=stats.log
總結(jié)
以上是生活随笔為你收集整理的oracle 数据统计收集,Oracle 10g收集数据库统计信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 隐藏oracle数据库,如何隐藏Orac
- 下一篇: 容易忽视的十大SQL优化方案!