首页 > 数据库 > Oracle > 10g和11g自动统计的区别
Oracle 10g 和11g 自动统计的区别。
10g:
oracle10g中,自动统计信息收集作业名为GATHER_STATS_JOB
SELECT JOB_NAME, PROGRAM_NAME, SCHEDULE_NAME
FROM DBA_SCHEDULER_JOBS
WHERE JOB_NAME = 'GATHER_STATS_JOB';
GATHER_STATS_JOB实际上是调用了DBMS_STATS包里的存储过程dbms_stats.gather_database_stats_job_proc,也就是说10g中自动统计信息收集作业的核心逻辑就是通过调用此存储过程来实现的。
select program_action from dba_scheduler_programs where program_name='GATHER_STATS_PROG'
10G中自动统计信息作业也配置的维护窗口有两个。
select * from dba_scheduler_wingroup_members where window_group_name='MAINTENANCE_WINDOW_GROUP'
从如下查询可以看到维护窗口WEEKNIGHT_WINDOW从周一到周五晚上的十点开始运行,最长运行8个小时,即最长可以运行到第二天早上6点。
维护窗口WEEKEND_WINDOW从周六早上零点开始运行,最长运行2天(48小时),即最长可以运行到下周一早上零点。
select window_name, repeat_interval, duration
from dba_scheduler_windows
where window_name in ('WEEKNIGHT_WINDOW', 'WEEKEND_WINDOW')
and enabled = 'TRUE';
从以下查询结果可以看到,oracle并没有对两个维护窗口施加资源控制,也就意味着oracle 10g 中的自动统计信息收集作业在运行是可以无限制地消耗系统资源。
select window_name,resource_plan from dba_scheduler_windows;
查看oracle自动统计实际情况
SELECT actual_start_date,job_name,status from
( select * from dba_scheduler_job_run_details
where job_name='GATHER_STATS_JOB' ORDER BY LOG_DATE DESC)
WHERE ROWNUM<4;
都是晚上10点开始执行的,而且都执行成功了。
oracle10g自动统计的缺陷:
1、可配置的维护窗口太少,只有两个,这不够灵活。
在这样的维护窗口设置下,周一至周五,周六至周日的维护窗口分别都是一个整体,如果修改了WEEKNIGHT_WINDOW的设置,那么周一至周五的自动统计信息收集作业就都得遵从修改后的设置(WEEKEND_WINDOW同理),如果想把周二和周三的作业改成晚上9点执行,这么简单一个需求,只有这么两个维护窗口是无法实现的。
2、oracle10g并没有对两个维护窗口施加资源控制,也就意味着oracle 10g 中的自动统计信息收集作业在运行是可以无限制地消耗系统资源。这样很可能会影响到系统正常的业务处理。
11g:
1、取消了名为GATHER_STATS_JOB的作业。
2、引入了一个名为GATHER_STATS_PROG的自动运行任务,专用于自动收集统计信息,它其实上就是10g中的GATHER_STATS_JOB对应的应用程序GATHER_STATS_PROG。自动运行任务GATHER_STATS_PROG所对应客户端的名称为“auto optimizer stats collection”
select client_name,task_name,operation_name,ststus from dba_autotask_task;
3、GATHER_STATS_PROG实际上也是调用了DBMS_STATS包里的存储过程dbms_stats.gather_database_stats_job_proc,也就是说11g中自动统计信息收集作业的核心逻辑就是通过调用此存储过程来实现的。和10g是一样的。
4、维护窗口增加到了7个每天一个,分别是MONDAY_WINDOW TUESDAY_WINDOW WEDNESDAY_WINDOW THURSDAY_WINDOW FRIDAY_WINDOW SATURDAY_WINDOW SUNDAY_WINDOW
SELECT WINDOW_NAME,AUTOTASK_STATUS FROM DBA_AUTOTASK_WINDOW_CLIENTS;
5、从下边的查询可以看出,周一至周五晚上的十点开始运行,最长运行4个小时,即最长可以运行到第二天早上2点。
周六维护窗口从早晨6点开始执行,最长运行20个小时,即最长可以运行到第二天(周日)凌晨两点。
周日维护窗口从周日早上6点开始执行,最长运行20个小时,即最长可以运行到第二天(周一)凌晨两点
Select window_name,repeat_interval,duration from dba_scheduler_windows and enabled = 'TRUE';
6、从如下查询可以看出,已经对7个窗口施加了资源控制,其对应的resource plan的名称为"DEFAULT_MAINTENANCE_PLAN",这也就意味着,11g的自动统计信息收集作业在运行时所消耗的资源会受到控制。
7、11g自动运行任务GATHER_STATS_PROG,每次运行时会先生成名为“ORA$AT_OS_OPT_XXX”的作业,然后再执行这个作业。
SELECT actual_start_date,job_name,status from
( select * from dba_scheduler_job_run_details
where job_name like 'ORA$AT_OS_OPT%') ORDER BY LOG_DATE DESC)
WHERE ROWNUM<4;
从如下查询可以看出ORA$AT_OS_OPT_XXX实际上对应的就是它们的维护窗口,并且它们就是自动运行任务GATHER_STATS_PROG所对应客户端“auto optimizer stats collection”生成的作业
SELECT client_name,window_name,job_name,job_start_time from
(select * from dba_autotask_job_history where client_name='auto optimizer stats collection' order by window_start_time desc)
where rownum<4;
10G
禁掉周一至周五自动统计的收集作业:
BEGIN
DBMS_SCHEDULER.DISABLE(
name=>' "SYS"."WEEKNIGHT_WINDOW" ',
force=>TRUE);
END;
/
11g
禁掉周一自动统计的收集作业,将周二的起始执行时间调整到晚上11点,将周三的起始执行时间调整到晚上9点,并同时将周三最长执行时间调整为5个小时:
周一:
BEGIN
DBMS_SCHEDULER.DISABLE(
name=>' "SYS"."MONDAY_WINDOW" ',
force=>TRUE);
END;
/
周二:
注意,要改可配置的周二维护窗口,就要先DISABLE,然后再改,然后在ENABLE
BEGIN
DBMS_SCHEDULER.DISABLE(
name=>' "SYS"."TUESDAY_WINDOW" ',
force=>TRUE);
END;
/
这里将周二维护窗口的repeat_interval的byhour属性设为23,即代表晚上11点
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name=>' "SYS"."TUESDAY_WINDOW" ',
attribute=> 'repeat_interval',
value=> 'freq=daily;byday=TUE;byhour=23;byminute=0;bysecond=0');
END;
/
BEGIN
DBMS_SCHEDULER.ENABLE(
name=>' "SYS"."TUESDAY_WINDOW" ',
force=>TRUE);
END;
/
周三:
调整为五个小时:
先禁掉,将duration设置为300分钟,即表示最长执行时间为5个小时
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name=>' "SYS"."WEDNESDAY_WINDOW" ',
attribute=> 'duration',
value=> numtodsinterval (300, 'minute'));
END;
/
然后激活
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29893219/viewspace-1851613/ ,如需转载,请注明出处,否则将追究法律责任。