我们发现有很多dba对oracle的统计分析都存在一些误解,认为这个是oracle后台自动运行的,我们不用去关心,我觉得统计分析有很深的学问。
我想问大家的是:
1、你们开启了的每天收集统计信息,每天窗口运行正常吗?
2、所有的表都使用oracle的自动窗口收集?大表是不是要考虑定制收集?分区表是不是要增量收集?
3、在不影响业务的情况下,什么时间段收集统计信息?
4、如何判断统计信息是否过期,如何判断哪些字段需要收集直方图,收集的规则是什么?
下面我来一一解答:
1、
查询自动任务是否开启
SELECT OPERATION_NAME,STATUS FROM DBA_AUTOTASK_OPERATION WHERE CLIENT_NAME LIKE '%stats%';
STATUS为ENABLED表示任务开启
如果为DISABLE exec dbms_auto_task_admin.ENABLE(client_name => 'auto optimizer stats collection',operation =>'auto optimizer stats job',window_name=> null);
查看后台的窗口信息:
select * from dba_scheduler_windows
查看每天的统计JOB是否成功racle11g调用窗口会自动生成以ORA$AT_OS_OPT开头的JOB
select * from dba_scheduler_job_run_details where job_name LIKE '%ORA$AT_OS_OPT%' ORDER BY LOG_DATE DESC
如果stoped要查看具体的内容:我这边有两次发生stop.
(1) 执行总共收集的时间,超出了收集窗口的时间(默认是周一到周五 22:00~02:00 4个小时 周六和周日06:00~02:00 20个小时)
解决办法:可以开启并行收集(默认是串行)
EXEC DBMS_STATS.SET_PARAM('DEGREE',4);
或者将窗口时间调长
begin
dbms_scheduler.set_attribute(name => 'TUESDAY_WINDOW', attribute => 'duration', value =>numtdosinterval(480,'minute'));
end;
/
(2) job执行到一半的时候,由于其它窗口启动导致收集终止。
解决办法:将收集的窗口优先级调高
BEGIN
dbms_scheduler.set_attribute(
name => '
我想问大家的是:
1、你们开启了的每天收集统计信息,每天窗口运行正常吗?
2、所有的表都使用oracle的自动窗口收集?大表是不是要考虑定制收集?分区表是不是要增量收集?
3、在不影响业务的情况下,什么时间段收集统计信息?
4、如何判断统计信息是否过期,如何判断哪些字段需要收集直方图,收集的规则是什么?
下面我来一一解答:
1、
查询自动任务是否开启
SELECT OPERATION_NAME,STATUS FROM DBA_AUTOTASK_OPERATION WHERE CLIENT_NAME LIKE '%stats%';
STATUS为ENABLED表示任务开启
如果为DISABLE exec dbms_auto_task_admin.ENABLE(client_name => 'auto optimizer stats collection',operation =>'auto optimizer stats job',window_name=> null);
查看后台的窗口信息:
select * from dba_scheduler_windows
查看每天的统计JOB是否成功racle11g调用窗口会自动生成以ORA$AT_OS_OPT开头的JOB
select * from dba_scheduler_job_run_details where job_name LIKE '%ORA$AT_OS_OPT%' ORDER BY LOG_DATE DESC
如果stoped要查看具体的内容:我这边有两次发生stop.
(1) 执行总共收集的时间,超出了收集窗口的时间(默认是周一到周五 22:00~02:00 4个小时 周六和周日06:00~02:00 20个小时)
解决办法:可以开启并行收集(默认是串行)
EXEC DBMS_STATS.SET_PARAM('DEGREE',4);
或者将窗口时间调长
begin
dbms_scheduler.set_attribute(name => 'TUESDAY_WINDOW', attribute => 'duration', value =>numtdosinterval(480,'minute'));
end;
/
(2) job执行到一半的时候,由于其它窗口启动导致收集终止。
解决办法:将收集的窗口优先级调高
BEGIN
dbms_scheduler.set_attribute(
name => '