oracle 调度对象统计信息的收集

2023年 10月 14日 41.8k 0

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调度的任务)。

 

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论