一、手动收集统计信息
部分参数说明:
 (1)estimate_percent:表示选择的采样比例,如果太低,收集速度会快,但可能不会很准确,如果太高,收集速度会慢,但比较准确,各有利弊,默认是100%。
 (2)degree:并行统计信息收集,应根据对象的大小和并行性初始化参数的设置选择恰当的并行度,默认为null。
 (3)cascade:表示是否收集对应的索引、列等的统计信息。
 (4)granularity:有四个可选项:
 all:采集global、partition、subpartition等粒度统计信息。
 auto:根据分区类型,由Oracle确定统计信息采集粒度。
 partition:只采集partition粒度统计信息。
 subpartition:只采集subpartition粒度统计信息。
1.全库收集
begin
 dbms_stats.gather_database_stats(ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => ‘for all indexed columns size auto’, cascade=>true, degree=>8);
 end;
 /
2.schema收集
exec dbms_stats.gather_schema_stats(ownname=>‘TEST’,estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE,degree=>8,cascade=>true,granularity=>‘ALL’);
3.表收集
exec dbms_stats.gather_table_stats(ownname=>‘TEST’,tabname=>‘TEST’,estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE,degree=>8,cascade=>true,granularity=>‘ALL’);
4.分区收集
begin
 dbms_stats.gather_table_stats(ownname => ‘SCOTT’,
 tabname => ‘表名’,
 partname = ‘分区名’,
 estimate_percent = DBMS_STATS.AUTO_SAMPLE_SIZE,
 degree => 8,
 cascade => true,
 granularity => ‘PARTITION’,
 method_opt > ‘FOR ALL INDEXED COLUMNS’);
 end;
 /
5.数据字典收集
exec dbms_stats.gather_dictionary_stats (estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE,degree=>8,cascade=>true,granularity=>‘ALL’);
6.动态性能表统计信息
exec dbms_stats.gather_fixed_objects_stats;
7.硬件统计信息收集
–典型业务开始前
 exec dbms_stats.gather_system_stats(‘START’);
–典型业务结束后
 exec dbms_stats.gather_system_stats(‘STOP’);
8.锁定统计信息
对于有些表或者用户的数据基本不怎么发生变化,如果每次收集时也将其收集一边浪费资源,因此可以将这些表或者用户进行统计信息采集的锁定。
 –锁定表
 exec dbms_stats.lock_table_stats(‘owner name’,‘table name’);
–锁定整个schema
 exec dbms_stats.lock_schema_stats (‘schema name’);
解除锁定:
 –表
 exec dbms_stats.unlock_table_stats(‘owner name’,‘table name’);
–schema
 exec dbms_stats.unlock_schema_stats (‘schema name’);
9.删除统计信息
EXEC DBMS_STATS.DELETE_TABLE_STATS(‘SCOTT’,‘EMP’);
二、修改自动收集统计信息计划
注意:window不是常说的操作系统,在这里指的是一个时间窗口的概念。
 scheduler_job在时间窗口内运行,不同的时间窗口对应不同的资源策略,例如可以为不同的时间段的window指定不同的CPU和IO,甚至为指定的用户自动临时授予权限等,
 当window时间段过去之后,分配另一个合适的资源限制策略,将系统资源留给业务。
1.查看自动统计信息是否开启
SQL> select client_name,status from dba_autotask_client;
CLIENT_NAME						   STATUS
--------------------------------- --------
auto optimizer stats collection    ENABLED
auto space advisor				   ENABLED
sql tuning advisor				   ENABLED
ORACLE自动维护任务由以下部分构成:
 auto optimizer stats collection:自动收集统计信息任务
 auto space adviso:自动分段顾问,和segment碎片整理相关。
 sql tuning advisor:自动SQL调优顾问,收集压力大的SQL并提出建议(sqltrpt工具)
—dba_autotask_window_clients视图详解:
 WINDOW_NAME 窗口名
 WINDOW_NEXT_TIME 下次执行时间
 WINDOW_ACTIVE 窗口是否活动
 AUTOTASK_STATUS 整体自动任务是否启动
 OPTIMIZER_STATS 自动收集统计信息的任务是否启用
 SEGMENT_ADVISOR 自动分段顾问是否启用
 SQL_TUNE_ADVISOR 自动SQL调优顾问是否启用
 HEALTH_MONITOR 自动健康监测状态(默认disable)
注意:当AUTOTASK_STATUS值为disable时,即使后面单个部分值为enable,也不会运行。
(1)全部禁用和全部启用自动维护任务
 –全部禁用
 EXECUTE DBMS_AUTO_TASK_ADMIN.DISABLE;
 –全部启用
 EXECUTE DBMS_AUTO_TASK_ADMIN.ENABLE;
全部禁用或启用后,体现在dba_autotask_window_clients的AUTOTASK_STATUS字段。
(2)禁用和启用收集统计信息
 例如:禁用和启用自动收集统计信息任务
 –禁用
 begin
 dbms_auto_task_admin.disable(
 client_name => ‘auto optimizer stats collection’,
 operation => NULL,
 window_name => NULL);
 end;
 /
–启用
 BEGIN
 dbms_auto_task_admin.enable(
 client_name => ‘auto optimizer stats collection’,
 operation => NULL,
 window_name => NULL);
 END;
 /
执行结果查看dba_autotask_window_clients中的OPTIMIZER_STATS字段。
(3)禁用或者启用某天的自动维护任务
 begin
 dbms_auto_task_admin.disable(
 client_name => ‘auto optimizer stats collection’,
 operation => NULL,
 window_name => ‘FRIDAY_WINDOW’);
 end;
 /
begin
 dbms_auto_task_admin.enable(
 client_name => ‘auto optimizer stats collection’,
 operation => NULL,
 window_name => ‘FRIDAY_WINDOW’);
 end;
 /
执行结果可以通过dba_autotask_window_clients的optimizer_stats字段查看。
 当dbms_auto_task_admin.disable的window_name参数为null时,所有时间的收集统计信息任务将被全部关闭。
 begin
 dbms_auto_task_admin.enable(
 client_name => ‘auto optimizer stats collection’,
 operation => NULL,
 window_name => NULL);
 end;
 /
2.查看统计信息收集的时间段
默认策略:周一到周五晚上10点开始到2点结束;周末早上6点持续20个小时。
 select WINDOW_NAME,WINDOW_NEXT_TIME,WINDOW_ACTIVE,OPTIMIZER_STATS from DBA_AUTOTASK_WINDOW_CLIENTS order by WINDOW_NEXT_TIME;
注意:该dba_autotask_window_clients视图实际上取自dba_scheduler_windows和dba_scheduler_wingroup_members。
查看开始时间和持续时间:
SQL> set line 300  
col repeat_interval for a80
col duration for a30
SELECT W.WINDOW_NAME,W.REPEAT_INTERVAL,W.DURATION FROM DBA_SCHEDULER_WINDOWS W,DBA_SCHEDULER_WINGROUP_MEMBERS G WHERE W.WINDOW_NAME=G.WINDOW_NAME AND G.WINDOW_GROUP_NAME IN ('MAINTENANCE_WINDOW_GROUP','BSLN_MAINTAIN_STATS_SCHED');
WINDOW_NAME		    REPEAT_INTERVAL									         DURATION
------------------ --------------------------------------------------------- ---------------
MONDAY_WINDOW		freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0	 +000 04:00:00
TUESDAY_WINDOW		freq=daily;byday=TUE;byhour=22;byminute=0; bysecond=0	 +000 04:00:00
WEDNESDAY_WINDOW	freq=daily;byday=WED;byhour=22;byminute=0; bysecond=0	 +000 04:00:00
THURSDAY_WINDOW 	freq=daily;byday=THU;byhour=22;byminute=0; bysecond=0	 +000 04:00:00
FRIDAY_WINDOW		freq=daily;byday=FRI;byhour=22;byminute=0; bysecond=0	 +000 04:00:00
SATURDAY_WINDOW 	freq=daily;byday=SAT;byhour=6;byminute=0; bysecond=0	 +000 20:00:00
SUNDAY_WINDOW		freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0	 +000 20:00:00
3.调整时间段
需要重启该scheduler任务,先disable,再enable。
(1)调整起始时间
 begin
 dbms_scheduler.disable(name => ‘MONDAY_WINDOW’);
 dbms_scheduler.set_attribute(
 name => ‘MONDAY_WINDOW’,
 attribute => ‘REPEAT_INTERVAL’,
 value => ‘freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0’);
 dbms_scheduler.enable(name => ‘MONDAY_WINDOW’);
 end;
 /
(2)调整持续时间
 begin
 dbms_scheduler.disable(name => ‘MONDAY_WINDOW’);
 dbms_scheduler.set_attribute(
 name => ‘MONDAY_WINDOW’,
 attribute => ‘DURATION’,
 value => numtodsinterval(4, ‘hour’));
 dbms_scheduler.enable(name => ‘MONDAY_WINDOW’);
 end;
 /
注意:如果不加hour,默认为分钟。
查看统计信息收集情况
 select column_name,
 num_distinct,
 histogram,
 num_buckets,
 to_char(LAST_ANALYZED, ‘yyyy-mm-dd hh24:mi:ss’) LAST_ANALYZED
 from dba_tab_col_statistics
 where owner = ‘SCOTT’
 and table_name = ‘EMP’;
查看表的各个列的统计信息收集情况。
 
                             
                         
                            