1.1
调度对象统计信息的收集
查询优化器需要对象统计信息来正确地完成它的使命。因此,创建新的数据库后,会默认设置一个调用dbms_stats包的gather_database_stats_job_proc存储过程的后台作业。gather_database_stats_job_proc存储过程执行的操作与调用dbms_stats包的gather_database_stats存储过程时使用选项参数gather_stale和gather_empty执行的操作在本质上是相同的。注意,虽然在10.2版本中使用的是正常的作业,但是从11.1版本开始起,会将收集过程集成在自动维护任务里面。在两种情况下,任务都是使用dbms_scheduler包调度的,而不是dbms_job包。
警告 在11.2及之前的版本中,默认情况下任务的目标是除了固定表以外的所有对象。因此,你必须自己在数据库引擎负载高峰期处理固定表的对象统计信息收集的工作。建议在负载高峰期收集数据是因为固定表的内容强烈依赖于负载。例如x$ksuse表,它为每个会话包含一条记录。
1.1.1 10g 方式
gather_statsjob是在10g版本中自动设置的作业。其当前的配置,也就是下面示例中10.2版本的默认配置,可以通过下面的查询显示出来。输出是通过dbms_stats_job_10g.sql脚本生成的:
COLUMN program_owner FORMAT A13
COLUMN program_name FORMAT A17
COLUMN schedule_owner FORMAT A14
COLUMN schedule_name FORMAT A24
COLUMN schedule_type FORMAT A15
COLUMN enabled FORMAT A7
COLUMN state FORMAT A9
COLUMN program_type FORMAT A16
COLUMN program_action FORMAT A41
COLUMN enabled FORMAT A7
COLUMN window_name FORMAT A16
COLUMN repeat_interval FORMAT A37
COLUMN duration FORMAT A13
COLUMN enabled FORMAT A7
SELECT program_name, schedule_name,
enabled, state
FROM dba_scheduler_jobs
WHERE owner = 'SYS'
AND job_name = 'GATHER_STATS_JOB';
SELECT program_action, number_of_arguments,
enabled
FROM dba_scheduler_programs
WHERE owner = 'SYS'
AND program_name = 'GATHER_STATS_PROG';
SELECT w.window_name, w.repeat_interval,
w.duration, w.enabled
FROM dba_scheduler_jobs j,
dba_scheduler_wingroup_members m,
dba_scheduler_windows w
WHERE j.schedule_name = m.window_group_name
AND m.window_name = w.window_name
AND j.owner = 'SYS'
AND j.job_name = 'GATHER_STATS_JOB';
总结起来,其配置如下。
Ø 作业执行gather_stats_prog程序并且可以在maintenance_window_group窗口组中运行。
Ø gather_stats_prog程序不使用任何参数调用dbms_stats包的gather_database_stats_job_proc存储过程。因为没有任何参数传递进来,唯一能够改变此存储过程行为的办法就是改变dbms_stats包的默认配置,正如8.4节中介绍的那样。注意这个存储过程是未公开的,并被标记为“仅供内部使用”。
Ø maintenance_window_group窗口组有两个成员:weeknight_window窗口和weekend_window窗口。前者从星期一到星期五每天晚上开放八个小时。后者在星期六和星期日开放。收集对象统计信息的任务在这两个窗口中的一个打开时执行。
Ø 作业、程序以及窗口都是启用的。
应该检查默认调度程序的开放时间和持续时长,并且在必要的时候,改变它们以精确匹配统计信息收集的频率。如有可能,它们应该匹配低负载的时间段。
每次作业因为窗口关闭而停止运行,都会产生一个包含所有没有来得及处理的对象列表的跟踪文件,并写入到由background_dump_dest初始化参数指定的目录中。下面是对这种跟踪文件的一段摘录:
GATHER_STATS_JOB: Stopped by Scheduler.
Consider increasing the maintenance window
duration if this happens frequently.
The following objects/segments were not
analyzed due to timeout:
TABLE:"SH"."SALES"."SALES_1995"
TABLE:"SH"."SALES"."SALES_1996"
TABLE:"SH"."SALES"."SALES_H1_1997"
...
TABLE:"SYS"."WRI$_OPTSTAT_AUX_HISTORY".""
TABLE:"SYS"."WRI$_ADV_OBJECTS".""
TABLE:"SYS","WRI$_OPTSTAT_HISTGRM_HISTORY".""
error
1013 in job
queue process
ORA-01013:
user requested cancel
of current operation
要启用或禁用gather_stats_job作业,可以使用下面的PL/SQL调用:
dbms_scheduler.enable(name=>'sys.gather_stats_job')
dbms_scheduler.disable(name=>'sys.gather_stats_job')
默认情况下,只有sys用户能够执行这些调用。其他用户需要alter object权限。举例来说,通过执行下面的SQL语句, system用户不仅能够修改而且也能删除gather_stats_job作业:
grant alter on gather_stats_job to system;
1.1.2 11g 和12c方式
从11.1版本开始,对象统计信息的收集被集成到自动维护任务中。所以,上一节中描述的gather_stats_job作业就不复存在了。当前的配置,也就是下面例子中11.2版本的默认配置,可以通过下面的查询显示出来。输出部分是由dbms_stats_job_11g.sql脚本生成的:
COLUMN task_name FORMAT A17
COLUMN status FORMAT A7
COLUMN program_action FORMAT A41
COLUMN enabled FORMAT A7
COLUMN window_group FORMAT A14
COLUMN window_name FORMAT A16
COLUMN repeat_interval FORMAT A53
COLUMN duration FORMAT A13
COLUMN enabled FORMAT A7
SELECT task_name, status
FROM dba_autotask_task
WHERE client_name = 'auto optimizer stats
collection';
SELECT program_action, number_of_arguments,
enabled
FROM dba_scheduler_programs
WHERE owner = 'SYS'
AND program_name = 'GATHER_STATS_PROG';
SELECT window_group
FROM dba_autotask_client
WHERE client_name = 'auto optimizer stats
collection';
SELECT w.window_name, w.repeat_interval,
w.duration, w.enabled
FROM dba_autotask_window_clients c,
dba_scheduler_windows w
WHERE c.window_name = w.window_name
AND c.optimizer_stats = 'ENABLED';
总结起来,其配置如下。
Ø gather_stats_prog程序不使用任何参数调用dbms_stats包的gather_database_stats_job_proc过程。因为没有任何参数传递进来,唯一能够改变此过程的行为的办法就是改变dbms_stats包的默认配置,如8.4节所述。注意这个过程是未公开的,并被标记为“仅供内部使用”。
Ø 用于自动维护任务的窗口组有七个成员,一个星期中的每一天对应一个。从星期一到星期五,每天开放四个小时。从星球六到星期日,每天开放20个小时。收集对象统计信息的任务会在这些窗口中的一个打开时执行。注意当一个窗口打开了很长时间后,例如在周末,gather_stats_prog程序每隔四个小时重启一次。
Ø 维护任务、程序以及窗口都是启用的。
应检查默认调度程序的开放时间和持续时长,并且在必要的时候,改变它们以精确匹配统计信息收集的频率。如有可能,它们应该匹配低负载的时间段。
要完全启用或禁用维护任务,可以使用下面的PL/SQL调用:通过将windows_name参数设置为一个非空值,还可以为一个单独的窗口启用或禁用维护任务。
dbms_ auto_task_admin.enable(client_name
=>'auto optimizer stats collection',
operation
=> NULL,
window_name => NULL);
dbms_ auto_task_admin.disable(client_name
=>'auto optimizer stats collection',
operation
=> NULL,
window_name => NULL);
警告 从11.2版本开始,将job_queue_processes初始化参数设置为0即可禁用自动统计信息作业(以及其他所有通过该Scheduler调度的任务)。