1. 程式人生 > >Oracle 10g收集數據庫統計信息

Oracle 10g收集數據庫統計信息

版本 degree gin 維護 http sam 由於 global impdp

  • 1.需求概述
  • 2.實施步驟
  • 3.回退方案

1.需求概述

某數據庫由於整體統計信息不準確,多次出現部分業務SQL選錯執行計劃,從而導致性能下降影響到最終用戶體驗,目前通過SQL_PROFILE綁定執行計劃臨時解決,但此方法不夠靈活,後續維護工作量也會增加。
Oracle優化器(CBO)依賴數據庫統計信息來計算目標SQL各種可能的執行路徑的成本,並從中選擇一條成本值最小的執行路徑來作為目標SQL的執行計劃。如果統計信息不準確甚至是錯誤,會導致優化器選擇錯誤SQL執行計劃的概率大大增加。
目前計劃對該數據庫統計信息進行重新收集,因為生產環境的復雜性,不排除重新收集正確的統計信息後,整體性能反而下降的情況。故而在收集之前需要對原有的統計信息做好備份,如發現收集後性能反而下降的極端情況,也可以快速回退到原有的統計信息。

2.實施步驟

2.1備份當前數據庫統計信息
備份當前數據庫的統計信息,建議備份後再導出一份留存:

--備份當前數據庫的統計信息:
begin
 DBMS_STATS.CREATE_STAT_TABLE(‘SYSTEM‘,‘DB_STATS_20190118‘); 
 DBMS_STATS.EXPORT_DATABASE_STATS(STATTAB => ‘DB_STATS_20190118‘, STATOWN => ‘SYSTEM‘);
end;
/

--備份後再導出一份留存
expdp \‘/ as sysdba\‘ directory=DATA_PUMP_DIR dumpfile=stats.dmp logfile=stats.log tables=system.db_stats_20190118

2.2收集數據庫統計信息
收集數據庫的統計信息,需要在業務閑時操作:

--開啟計時
set timing on

--開始收集全庫統計信息
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的值並不是設置越高就越快,同時要根據實際CPU具體情況來設置。

如果數據庫是11.2.0.2及以上版本,還可以通過DBMS_STATS.SET_GLOBAL_PREFS設置並發收集進一步提升收集效率,具體可參考:

  • Oracle 11g快速收集全庫統計信息

3.回退方案

3.1正常回退
收集統計信息後發現性能大幅下降,正常回退,直接將原統計信息導入:

--正常回退,直接將原統計信息導入:
exec DBMS_STATS.IMPORT_DATABASE_STATS (STATTAB => ‘DB_STATS_20190118‘, STATOWN => ‘SYSTEM‘);

3.2其他情況
如果DB_STATS_20190118被損壞,可以刪除後使用之前的備份導入:

--刪除DB_STATS_20190118:
exec DBMS_STATS.DROP_STAT_TABLE (‘SYSTEM‘,‘DB_STATS_20190118‘);
--使用之前的備份導入DB_STATS_20190118:
impdp \‘/ as sysdba\‘ directory=DATA_PUMP_DIR dumpfile=stats.dmp logfile=stats.log

Oracle 10g收集數據庫統計信息