Oracle统计信息的收集和维护

2年前 (2022) 程序员胖胖胖虎阿
209 0 0

一、手动收集统计信息

部分参数说明:
(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’;

查看表的各个列的统计信息收集情况。

版权声明:程序员胖胖胖虎阿 发表于 2022年11月9日 上午11:48。
转载请注明:Oracle统计信息的收集和维护 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...