禁用11g的统计数据自动收集功能

数据库报错
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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/751371/viewspace-745410/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值