禁用11g的統計資料自動收集功能

聽海★藍心夢發表於2012-09-29
資料庫報錯
GATHER_STATS_JOB encountered errors.  Check the trace file.
Errors in file /opt/oracle/diag/rdbms/dbserver1/dbserver1/trace/dbserver1_j003_10544.trc:
ORA-20011: Approximate NDV failed: ORA-01476: divisor is equal to zero

環境
ORACLE 11G R2
REDHAT 5.3 FOR 64 BIT

解決
網上給出的結論是BUG。
Bug No: 6040840 
Filed 09-MAY-2007 Updated 10-MAY-2007 
Product Oracle Server - Enterprise Edition Product Version  9.2.0.8 
Platform. AIX5L Based Systems (64-bit) Platform. Version No Data 
Database Version 9.2.0.8 Affects Platforms  Generic 
Severity Severe Loss of Service Status Duplicate Bug. To Filer 
Base Bug 5645718 Fixed in Product Version No Data

Problem statement:
DBMS_STATS.GATHER_TABLE_STATS FAILS WITH ORA-1476. 
WORKAROUND: ----------- n/a . RELATED BUGS: ------------- Bug#5645718.

不過我的資料庫版本是11G,應該不是這個BUG。
檢查日誌發現:
*** 2012-09-29 06:00:16.870
GATHER_STATS_JOB: GATHER_TABLE_STATS('"MIS"','"T_SALES_ORDER_ITEM"','""', ...)
ORA-20011: Approximate NDV failed: ORA-01476: divisor is equal to zero

檢查T_SALES_ORDER_ITEM表發現該表select的時候也報錯:
ORA-01476: divisor is equal to zero

檢視錶結構:
CREATE TABLE T_SALES_ORDER_ITEM
(
  ID             NUMBER(18)                     NOT NULL,
  ......
  PREPAY_RATE    NUMBER GENERATED ALWAYS AS (ROUND(TO_NUMBER(TO_CHAR("PREPAYMONEY"))*100/("PRICE"*"QUANTITY"),2))
  ......

最後 select price,quantity from T_SALES_ORDER_ITEM發現price有等於0的值!!!問題並不難解決,發現問題才是至關重要的。
修改PREPAY_RATE列,新增decode判斷函式:
 PREPAY_RATE    NUMBER GENERATED ALWAYS AS (DECODE("PRICE",0,0,ROUND(TO_NUMBER(TO_CHAR("PREPAYMONEY"))*100/("PRICE"*"QUANTITY"),2)))


補充知識:
查詢問題過程中曾經懷疑是自動收集統計資訊的問題。和BUG 6040840很相似,但是我的資料庫是11g r2,所以排除了BUG 6040840的可能性。

手工停止自動收集統計資訊任務
在Oracle的11g版本中提供了統計資料自動收集的功能。在部署安裝11g Oracle軟體過程中,其中有一個步驟便是提示是否啟用這個功能(預設是啟用這個功能)。這個功能貌似帶來了統計資料採集上的便捷,但是其中卻隱藏著效能隱患。在7*24小時的系統中這種自動執行的任務很有可能對系統效能帶來衝擊。

1、檢視自動收集統計資訊的任務及狀態
SQL> select client_name,status from dba_autotask_client;

CLIENT_NAME                           STATUS
------------------------------------- --------
auto optimizer stats collection       ENABLED
auto space advisor                    ENABLED
sql tuning advisor                    ENABLED

其中“auto optimizer stats collection”便是我們要尋找的自動收集統計資訊的任務名稱,它的狀態目前是啟用狀態。

2、禁止自動收集統計資訊的任務
使用DBMS_AUTO_TASK_ADMIN包完成這個任務。
SQL> exec DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'auto optimizer stats collection',operation => NULL,window_name => NULL);

PL/SQL procedure successfully completed.

SQL> select client_name,status from dba_autotask_client;

CLIENT_NAME                           STATUS
------------------------------------- --------
auto optimizer stats collection       DISABLED
auto space advisor                    ENABLED
sql tuning advisor                    ENABLED

此時“auto optimizer stats collection”任務已經被禁用,目的達到。

3、啟用自動收集統計資訊的任務
SQL> exec DBMS_AUTO_TASK_ADMIN.ENABLE(client_name => 'auto optimizer stats collection',operation => NULL,window_name => NULL);

PL/SQL procedure successfully completed.

SQL> select client_name,status from dba_autotask_client;

CLIENT_NAME                           STATUS
------------------------------------- --------
auto optimizer stats collection       ENABLED
auto space advisor                    ENABLED
sql tuning advisor                    ENABLED

10g和11g對比
10g中檢視收集統計資訊作業的方法

SQL> col JOB_NAME for a16
SQL> col PROGRAM_NAME for a18
SQL> col SCHEDULE_NAME for a20
SQL> col SCHEDULE_NAME for a24
SQL> col JOB_CLASS for a20
SQL> select job_name, program_name, schedule_name, job_class from dba_scheduler_jobs where job_name = 'GATHER_STATS_JOB';

JOB_NAME         PROGRAM_NAME       SCHEDULE_NAME            JOB_CLASS
---------------- ------------------ ------------------------ --------------------
GATHER_STATS_JOB GATHER_STATS_PROG  MAINTENANCE_WINDOW_GROUP AUTO_TASKS_JOB_CLASS

11g中檢視收集統計資訊作業的方法
SQL> select client_name,status from dba_autotask_client;

CLIENT_NAME                           STATUS
------------------------------------- --------
auto optimizer stats collection       ENABLED
auto space advisor                    ENABLED
sql tuning advisor                    ENABLED

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/751371/viewspace-745410/,如需轉載,請註明出處,否則將追究法律責任。

相關文章