一、手动收集统计信息
部分参数说明: (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’;
查看表的各个列的统计信息收集情况。
|