前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自动统计信息收集(Automatic Optimizer Statistics Collection)

自动统计信息收集(Automatic Optimizer Statistics Collection)

作者头像
SQLplusDB
发布2020-03-25 18:46:58
1.4K0
发布2020-03-25 18:46:58
举报
文章被收录于专栏:Oracle数据库技术

概述

本文主要介绍自动统计信息收集(Automatic Optimizer Statistics Collection)任务。

自动统计信息收集(Automatic Optimizer Statistics Collection):

10g

从Oracle 10g版本开始,在默认设定的情况下,Oracle会通过自动维护作业,自动地收集优化器统计信息(Optimizer Statistics)。

自动统计信息收集相关设定

10g的自动统计信息收集主要和以下的3个设定相关:

代码语言:javascript
复制
1.调度作业 GATHER_STATS_JOB(默认:有效'SCHEDULED')
如前一章介绍,10g数据库做成时会自动地做成调度作业【GATHER_STATS_JOB】,通过预定义的维护窗口(Maintenance Windows)进行执行。   WEEKNIGHT_WINDOW : 周一到周五 每天22:00开始 ~ 次日06:00结束。
   WEEKEND_WINDOW   :周六和周日的全天2.数据库对象的MONITORING属性(默认:有效 statistics_level=TYPICAL)
从Oracle 8i开始,Oracle针对数据库对象推出了MONITORING属性,通过这个属性可以监视表(及其分区)的DML更新操作(如insert,update,delete,direct load)并记录更新数。10g以后MONITORING属性主要依赖于初始化参数statistics_level的设定,当初始化参数statistics_level为默认值(TYPICAL)或ALL时,会针对一时表以外的所有表启用MONITORING属性,监视DML更新操作并记录更新数。。3.统计信息的Lock状况(默认:统计信息不锁定)
如果对象的统计信息上进行了锁定(lock Statistics),统计信息不会被更新。所以,统计信息上进行了锁定的对象不会作为自动统计信息收集的对象。关于统计信息的锁定可以参考DBMS_STATS包的LOCK_SCHEMA_STATS、LOCK_TABLE_STATS等程序。
自动统计信息收集基本流程

自动统计信息收集基本流程如下:

代码语言:javascript
复制
1.当调度作业【GATHER_STATS_JOB】有效时,会在在预定义的维护窗口执行DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC程序进行统计信息收集。2.统计信息收集的对象为满足以下条件的表:   1)统计信息不锁定
   2)没有统计信息 或者
      上一次统计信息收集后,表中10%的行被更新。3.统计信息收集的顺序如下:
   1)没有统计信息的对象
   2)上一次统计信息收集后变更量较多的对象
   3)1)2)相同的,先收集大小比较小的对象
自动统计信息收集的动作确认

自动统计信息收集的相关动作可以通过以下视图进行查看:

1.GATHERSTATSJOB 的状态和设定内容

代码语言:javascript
复制
SQL> set linesize 200
SQL> col job_name format a20
SQL> col program_name format a20
SQL> col schedule_name format a25
SQL> col state format a20
SQL>
SQL> SELECT job_name,
              program_name,
              schedule_name,
              state,
              stop_on_window_close
       FROM   dba_scheduler_jobs
       WHERE  job_name = 'GATHER_STATS_JOB';  2    3    4    5    6    7  JOB_NAME             PROGRAM_NAME         SCHEDULE_NAME             STATE                STOP_ON_WINDOW_
-------------------- -------------------- ------------------------- -------------------- ---------------
GATHER_STATS_JOB     GATHER_STATS_PROG    MAINTENANCE_WINDOW_GROUP  SCHEDULED            TRUE

从上面的输出我们可以看到,GATHERSTATSJOB作业运行在MAINTENANCEWINDOWGROUP窗口组中,并且状态为‘SCHEDULED’即有效状态。 并且其中STOPONWINDOW_CLOSE为True代表当窗口关闭时,作业会被终止。即,当超过窗口的持续时间时,即使统计信息收集作业没有完成,也会被取消。

2.运行窗口内容

代码语言:javascript
复制
--窗口组信息
SQL>  SELECT *
FROM   dba_scheduler_wingroup_members
WHERE  window_group_name = 'MAINTENANCE_WINDOW_GROUP';    2    3  WINDOW_GROUP_NAME         WINDOW_NAME
------------------------- --------------------
MAINTENANCE_WINDOW_GROUP  WEEKNIGHT_WINDOW
MAINTENANCE_WINDOW_GROUP  WEEKEND_WINDOW--窗口信息  
SQL> col repeat_interval format a60
SQL> col duration format a20
SQL> SELECT window_name,
      repeat_interval,
      duration
FROM   dba_scheduler_windows
WHERE  window_name IN ( 'WEEKNIGHT_WINDOW', 'WEEKEND_WINDOW' );   2    3    4    5  WINDOW_NAME          REPEAT_INTERVAL                                              DURATION
-------------------- ------------------------------------------------------------ --------------------
WEEKNIGHT_WINDOW     freq=daily;byday=MON,TUE,WED,THU,FRI;byhour=22;byminute=0; b +000 08:00:00
                    ysecond=0WEEKEND_WINDOW       freq=daily;byday=SAT;byhour=0;byminute=0;bysecond=0          +002 00:00:00

通过上面我们可以看到,窗口的运行时间为如下

代码语言:javascript
复制
WEEKNIGHT_WINDOW : 周一到周五 每天22:00开始 ~ 次日06:00结束。
WEEKEND_WINDOW   :周六0点开始,并且持续2天(到周日的23:59)。

其中,由于周五的窗口持续到周六06:00结束;由于Oracle一次只能打开一个窗口, 并且WEEKNIGHTWINDOW和WEEKENDWINDOW的优先度相同,所以WEEKEND_WINDOW的实际开始时间为周六06:00开始。

3.执行的程序内容

可以通过dbaschedulerprograms视图查询到GATHERSTATSPROG作业实际运行的程序。

代码语言:javascript
复制
SQL> col program_action format a50
SQL> SELECT program_action
FROM   dba_scheduler_programs
WHERE  program_name = 'GATHER_STATS_PROG';   2    3  PROGRAM_ACTION
--------------------------------------------------
dbms_stats.gather_database_stats_job_proc
自动统计信息收集的注意事项
代码语言:javascript
复制
1.通常情况下,gather_database_stats_job_proc程序执行时,系统字典表也作为统计信息收集对象。2.对于数据变化很大的表,建议通过锁定统计信息等方法,来避免作为自动统计信息收集的对象。
另外,针对一时表统计信息收集后也不会产生有效的信息,所以建议针对一时表采取动态统计的方法。例如:
EXECUTE DBMS_STATS.LOCK_TABLE_STATS ('SCOTT',  'EMP');3.可能由于统计信息收集时,可能会消耗大量的I/O、CPU等资源,所以可以根据业务内容调整自动统计信息收集的时间。

参考: Database Performance Tuning Guide

14.2 Automatic Statistics Gathering http://docs.oracle.com/cd/B19306_01/server.102/b14211/stats.htm#i41282

11g & 12c

从11g开始,导入了周一到周日的日次窗口,并且定义了自动维护任务功能。 10g中的GATHERSTATSJOB作业不再存在,而被变更为自动维护任务的一部分,所以JOB作业的状态不在通过 DBASCHEDULERJOBS视图确认,而是通过DBAAUTOTASKCLIENT 视图来查看。 而且对于自动维护任务的维护等会通过DBMSAUTOTASK_ADMIN程序包进行维护。 其他的动作基本和10g相同。

例如:

代码语言:javascript
复制
 --查看自动统计收集任务。
SQL> col client_name format a20
SQL> col window_group format a20
SQL>  SELECT client_name,
      status,
      window_group
FROM   dba_autotask_client
WHERE  client_name = 'auto optimizer stats collection';    2    3    4    5  CLIENT_NAME          STATUS   WINDOW_GROUP
-------------------- ----------------------------
auto optimizer stats ENABLED  ORA$AT_WGRP_OS
collection  
--禁用自动统计收集任务。
 BEGIN
 DBMS_AUTO_TASK_ADMIN.DISABLE(
 client_name => 'auto optimizer stats collection',
 operation => NULL,
 window_name => NULL);
 END;

参考: Database SQL Tuning Guide

>Configuring Automatic Optimizer Statistics Collection

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Oracle数据库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 自动统计信息收集(Automatic Optimizer Statistics Collection):
    • 10g
      • 自动统计信息收集相关设定
      • 自动统计信息收集基本流程
      • 自动统计信息收集的动作确认
      • 自动统计信息收集的注意事项
    • 11g & 12c
    相关产品与服务
    数据库
    云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档