文章目錄
【12.2 新功能】優化器統計顧問(Optimizer Statistics Advisor)及常見問題
關鍵字Keyword
Optimizer Statistics Advisor,統計信息 ,ORA-20001 , ORA-00932 ,12.2.0.1
優化器統計顧問概述
對於Oracle的CBO優化器而言,統計信息是其最重要的組成部分。
因此,Oracle在統計信息的準確性方面不斷地進行優化和加強。
從12.2版本開始,Oracle推出了優化器統計顧問(Optimizer Statistics Advisor),
根據事先定義的規則,定期執行,提供給用戶參考的統計信息收集相關的建議。
參考:
Home/Database/Oracle/Oracle Database/Release 12.2
SQL Tuning Guide
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/tgsql/optimizer-statistics-advisor.html#GUID-054F4B76-DD57-46EE-98EA-0FF04F49D1B3
>18 Analyzing Statistics Using Optimizer Statistics Advisor
Optimizer Statistics Advisor In 12.2 (Quick Overview) (Doc ID 2259398.1)
12c Release 2 New Feature : Statistics Advisor (Walk-Through) (Doc ID 2360311.1)
AUTO_STATS_ADVISOR_TASK Running Outside of Maintenance Window (Doc ID 2387110.1)
統計信息收集相關內容:
數據庫自動維護任務介紹
數據庫自動維護任務介紹(二)
自動統計信息收集Automatic Optimizer Statistics Collection
自動段指導Automatic Segment Advisor
在12.2.0.1以後的版本上運行該功能時,遇到問題的報告很多,但是Oracle也在不斷地修正着相關地問題,所以保持數據庫爲最新版本通常是一個最佳的選擇。
常見問題和解決方法:
問題1:ORA-12012, ORA-20001等錯誤
由於12.2.0.1等版本上的設計不足(Bug) 等,可能會在告警日誌(alert log)或者JOB跟蹤日誌中,發現ORA-12012, ORA-20001等錯誤。
例:
>ORA-12012: error on auto execute of job "SYS"."ORA$AT_OS_OPT_SY_nn"
>ORA-20001: Statistics Advisor: Invalid Task Name For the current user
>ORA-06512: at "SYS.DBMS_STATS", line 46861
>ORA-06512: at "SYS.DBMS_STATS_ADVISOR", line 734
>ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 19930
>ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 21934
>ORA-06512: at "SYS.DBMS_STATS", line 46851
可以參考如下方法嘗試解決。
1.通過dbms_stats.init_package()程序包,重新創建優化器統計顧問任務。
例:
EXEC dbms_stats.init_package();
-
首先看看這個bug 27983174和27774706是否被修復,如果存在則建議打上補丁或打上最新的RU.
如果沒有被修復,可向官方技術支持申請Patch 27983174 和Patch 27774706 補丁並應用。 -
應用Patch 27774706 補丁後,執行如下操作:
$ sqlplus / as sysdba
drop table WRI$_ADV_DEFINITIONS;
@?/rdbms/admin/catadvtb.sql
@?/rdbms/admin/utlrp.sql
execute dbms_advisor.setup_repository;
EXEC dbms_stats.init_package();
4.如果應用Patch 27774706 補丁過程中出錯的話,試着執行如下命令手動更新狀態。
UPDATE dba_registry_sqlpatch
SET status = 'SUCCESS', action_time = SYSTIMESTAMP
WHERE patch_id = 27774706 and status='WITH ERRORS' and rownum=1;
commit;
很多問題會在19c以後的版本進行修復,所以有可能的話注意保持版本的更新。
參考:
Recurring ORA-12012, ORA-20001, ORA-06512 In Container Database (Doc
ID 2420581.1) 12.2.0.0.2 Automatic Statistics Advisor Job Errors with
Statistics Fatal Error (Doc ID 2448436.1) Version 12.2.0.1 to
18.3.0.0.0 ORA-12012 Error on auto execute of job “SYS”."ORA$AT_OS_OPT_SY_ in 12.2.0 Database version or higher
release (like 18c) (Doc ID 2127675.1) Version 12.2.0.1 and later
問題2:SYSAUX表空間增長過快
由於優化器統計顧問的執行,SYSAUX表空間增長過快,導致可用表空間不足。
特徵:
V_ADV_OBJECTS佔據大量空間
解決方法:
-
嘗試刪除Statistics Advisor 任務(AUTO_STATS_ADVISOR_TASK),然後重建。
具體刪除方法例:
connect / as sysdba
--1.1 刪除Statistics Advisor 任務
DECLARE
v_tname VARCHAR2(32767);
BEGIN
v_tname := 'AUTO_STATS_ADVISOR_TASK';
DBMS_STATS.DROP_ADVISOR_TASK(v_tname);
END;
/
--1.2 刪除任務之後,重組表和所有索引
SQL> ALTER TABLE WRI$_ADV_OBJECTS MOVE;
SQL> ALTER INDEX WRI$_ADV_OBJECTS_IDX_01 REBUILD;
SQL> ALTER INDEX WRI$_ADV_OBJECTS_PK REBUILD;
注:如果在刪除過程中,發生ORA-20001等錯誤的話,可以執行下面的方法重建AUTO_STATS_ADVISOR_TASK來解決,
然後再執行上面的刪除方法,最終達到刪除Statistics Advisor 任務(AUTO_STATS_ADVISOR_TASK)的目的。
SQL> connect / as sysdba
SQL> EXEC DBMS_STATS.INIT_PACKAGE();
2. 縮短任務執行歷史的保存時間
– 確認當前設定的保持期間
select task_name, parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS
where task_name=‘AUTO_STATS_ADVISOR_TASK’ and PARAMETER_NAME like ‘%EXPIRE%’;
-- 修改設定的保持期間
可以通過下面的命令,將EXECUTION_DAYS_TO_EXPIRE修改爲10天,即執行歷史數據的保存時間爲10天:
connect /as sysdba
BEGIN
DBMS_SQLTUNE.SET_TUNING_TASK_PARAMETER (
task_name => 'AUTO_STATS_ADVISOR_TASK'
, parameter => 'EXECUTION_DAYS_TO_EXPIRE'
, value => 10
);
END;
/
參考:
How To Set DAYS_TO_EXPIRE and EXECUTION_DAYS_TO_EXPIRE of Automatic Statistics Advisor Task (Doc ID 2544788.1)
注:未來版本中,可以通過如下方法禁用Statistics Advisor 任務。
現階段(2020/1)無法禁用這個任務。
DECLARE
filter1 CLOB;
BEGIN
filter1 := DBMS_STATS.CONFIGURE_ADVISOR_RULE_FILTER('AUTO_STATS_ADVISOR_TASK',NULL,NULL,'DISABLE');
END;
/
參考:
升級DB到12.2.0.1版本之後,由於統計信息顧問導致SYSAUX 過快增長 (Doc ID 2440139.1) SYSAUX
Tablespace Grows Rapidly After Upgrading Database to 12.2.0.1 Due To
Statistics Advisor (Doc ID 2305512.1)
3. 12.2.0.1版本由於Bug 26764561的影響,即使EXECUTION_DAYS_TO_EXPIRE設成10天后,優化器統計顧問相關段依然不斷增加。
所以首先看看這個bug是否被修復,如果存在則建議打上補丁或打上最新的RU。
參考:
AUTO_STATS_ADVISOR_TASK Not Purging Even Though Setting EXECUTION_DAYS_TO_EXPIRE (Doc ID 2615851.1)
Bug 26764561(Doc ID 26764561.8)
※注意打補丁後的Postinstallation內容
■ 關於EXECUTION_DAYS_TO_EXPIRE的默認值:
ver<=18.3
SQL> EXEC DBMS_STATS.INIT_PACKAGE();
PL/SQL procedure successfully completed.
SQL> SELECT parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS
WHERE task_name='AUTO_STATS_ADVISOR_TASK'
and PARAMETER_NAME IN 'EXECUTION_DAYS_TO_EXPIRE';
2 3
PARAMETER_NAME
--------------------------------------------------------------------------------
PARAMETER_VALUE
--------------------------------------------------------------------------------
EXECUTION_DAYS_TO_EXPIRE
UNLIMITED
Version 19.3.0.0.0 &18.5 (Bug 27983174修復後)
SQL> SELECT parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS
WHERE task_name='AUTO_STATS_ADVISOR_TASK'
and PARAMETER_NAME IN 'EXECUTION_DAYS_TO_EXPIRE'; 2 3
PARAMETER_NAME
--------------------------------------------------------------------------------
PARAMETER_VALUE
--------------------------------------------------------------------------------
EXECUTION_DAYS_TO_EXPIRE
30
問題3:關於在多租戶環境中 CDB/PDB的設置問題
對於多租戶環境中,CDB/PDB的設置相對獨立,互相不影響。
■EXECUTION_DAYS_TO_EXPIRE的CDB/PDB設置測試:
---CDB側
SQL> conn / as sysdba
Connected.
SQL> SELECT parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS
WHERE task_name='AUTO_STATS_ADVISOR_TASK'
and PARAMETER_NAME IN 'EXECUTION_DAYS_TO_EXPIRE'; 2 3
PARAMETER_NAME
--------------------------------------------------------------------------------
PARAMETER_VALUE
--------------------------------------------------------------------------------
EXECUTION_DAYS_TO_EXPIRE
UNLIMITED
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
SQL>
BEGIN
DBMS_SQLTUNE.SET_TUNING_TASK_PARAMETER (
task_name => 'AUTO_STATS_ADVISOR_TASK'
, parameter => 'EXECUTION_DAYS_TO_EXPIRE'
, value => 30
);
END;
/
SQL> 2 3 4 5 6 7 8
PL/SQL procedure successfully completed.
SQL> SELECT parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS
WHERE task_name='AUTO_STATS_ADVISOR_TASK'
and PARAMETER_NAME IN 'EXECUTION_DAYS_TO_EXPIRE'; 2 3
PARAMETER_NAME
--------------------------------------------------------------------------------
PARAMETER_VALUE
--------------------------------------------------------------------------------
EXECUTION_DAYS_TO_EXPIRE
30
---PDB側
SQL> alter session set container=pdb1;
Session altered.
SQL> SELECT parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS
WHERE task_name='AUTO_STATS_ADVISOR_TASK'
and PARAMETER_NAME IN 'EXECUTION_DAYS_TO_EXPIRE';
PARAMETER_NAME
--------------------------------------------------------------------------------
PARAMETER_VALUE
--------------------------------------------------------------------------------
EXECUTION_DAYS_TO_EXPIRE
UNLIMITED
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB1 READ WRITE NO
SQL>
■PDB/CDB的JOB關聯性的測試:
SQL> conn / as sysdba
Connected.
SQL> select name, ctime, how_created,OWNER_NAME from sys.wri$_adv_tasks
where name in (‘AUTO_STATS_ADVISOR_TASK’,‘INDIVIDUAL_STATS_ADVISOR_TASK’); 2
AUTO_STATS_ADVISOR_TASK 25-SEP-19 CMD SYS
SQL> DECLARE
v_tname VARCHAR2(32767);
BEGIN
v_tname := ‘AUTO_STATS_ADVISOR_TASK’;
DBMS_STATS.DROP_ADVISOR_TASK(v_tname);
END;
/ 2 3 4 5 6 7
PL/SQL procedure successfully completed.
SQL> select name, ctime, how_created,OWNER_NAME from sys.wriSEED READ ONLY NO
3 PDB1 READ WRITE NO
—PDB中JOB的狀態
SQL> alter session set container=pdb1;
Session altered.
SQL> select name, ctime, how_created,OWNER_NAME from sys.wri$_adv_tasks
where name in (‘AUTO_STATS_ADVISOR_TASK’,‘INDIVIDUAL_STATS_ADVISOR_TASK’);
2 AUTO_STATS_ADVISOR_TASK 26-JAN-17 CMD SYS
INDIVIDUAL_STATS_ADVISOR_TASK 26-JAN-17 CMD SYS
SQL> DECLARE
v_tname VARCHAR2(32767);
BEGIN
v_tname := ‘AUTO_STATS_ADVISOR_TASK’;
DBMS_STATS.DROP_ADVISOR_TASK(v_tname);
END;
/ 2 3 4 5 6 7
PL/SQL procedure successfully completed.
SQL> select name, ctime, how_created,OWNER_NAME from sys.wri$_adv_tasks
where name in (‘AUTO_STATS_ADVISOR_TASK’,‘INDIVIDUAL_STATS_ADVISOR_TASK’);
2 INDIVIDUAL_STATS_ADVISOR_TASK 26-JAN-17 CMD SYS
—CDB 不會影響PDB
SQL> conn / as sysdba
Connected.
SQL> EXEC DBMS_STATS.INIT_PACKAGE();
PL/SQL procedure successfully completed.
SQL> select name, ctime, how_created,OWNER_NAME from sys.wri$_adv_tasks
where name in (‘AUTO_STATS_ADVISOR_TASK’,‘INDIVIDUAL_STATS_ADVISOR_TASK’);
2 AUTO_STATS_ADVISOR_TASK 15-NOV-19 CMD SYS
INDIVIDUAL_STATS_ADVISOR_TASK 15-NOV-19 CMD SYS
SQL> alter session set container=pdb1;
Session altered.
SQL> select name, ctime, how_created,OWNER_NAME from sys.wri$_adv_tasks
where name in (‘AUTO_STATS_ADVISOR_TASK’,‘INDIVIDUAL_STATS_ADVISOR_TASK’);
2 INDIVIDUAL_STATS_ADVISOR_TASK 26-JAN-17 CMD SYS
SQL>
問題4:PGA 限制ORA-4036
在執行統計信息收集JOB等的過程中會調用優化器統計顧問任務。
如果Statistics Advisor 任務的數據過多,有可能導致在執行統計信息收集JOB過程中引發ORA-4036.
例如輸出的跟蹤日誌中的HEAP DUMP中qosadvCreateSu Chunk佔用了較大空間,qosadvCreateSu是Statistics Advisor運行時所需的heap。
PRIVATE HEAP SUMMARY DUMP
2582 MB total:
1969 MB commented, 975 KB permanent
612 MB free (0 KB in empty extents),
2557 MB, 2 heaps: "callheap " 607 MB free held
------------------------------------------------------
Summary of subheaps at depth 1
1962 MB total:
1957 MB commented, 4805 KB permanent
1136 KB free (0 KB in empty extents),
1940 MB, 1 heap: "qosadvCreateSu " ★
可以通過定期刪除Statistics Advisor 任務的數據 或者增加PGA_AGGREGATE_LIMIT的大小來解決。
專注於技術不限於技術!
用碎片化的時間,一點一滴地提高數據庫技術和個人能力。
歡迎關注微信訂閱號:Oracle數據庫技術(TeacherWhat)