一、手动收集统计信息
部分参数说明:
(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’;
查看表的各个列的统计信息收集情况
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1381次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
840次阅读
2025-03-17 11:33:53
RAC 19C 删除+新增节点
gh
522次阅读
2025-03-14 15:44:18
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
481次阅读
2025-03-13 14:38:19
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
382次阅读
2025-03-12 21:27:56
Oracle DataGuard高可用性解决方案详解
孙莹
334次阅读
2025-03-26 23:27:33
墨天轮个人数说知识点合集
JiekeXu
281次阅读
2025-04-01 15:56:03
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
273次阅读
2025-03-10 07:58:44
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
259次阅读
2025-03-19 14:41:51
风口浪尖!诚通证券扩容采购Oracle 793万...
Roger的数据库专栏
257次阅读
2025-03-24 09:42:53