1、优化器相关统计信息
优化器统计范围:
表统计: 行数,块数,行平均长度;all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN;
列统计: 列中唯一值的数量(NDV),NULL值的数量,数据分布;
--DBA_TAB_COLUMNS:NUM_DISTINCT,NUM_NULLS,HISTOGRAM;
索引统计:叶块数量,等级,聚簇因子;
--DBA_INDEXES:LEAF_BLOCKS,CLUSTERING_FACTOR,BLEVEL;
系统统计:I/O性能与使用率;
CPU性能与使用率;
--存储在aux_stats$中,需要使用dbms_stats收集,I/O统计在X$KCFIO中;
2、统计信息相关数据字典
o DBA_TABLES
o DBA_OBJECT_TABLES
o DBA_TAB_STATISTICS
o DBA_TAB_COL_STATISTICS
o DBA_TAB_HISTOGRAMS
o DBA_INDEXES
o DBA_IND_STATISTICS
o DBA_CLUSTERS
o DBA_TAB_PARTITIONS
o DBA_TAB_SUBPARTITIONS
o DBA_IND_PARTITIONS
o DBA_IND_SUBPARTITIONS
o DBA_PART_COL_STATISTICS
o DBA_PART_HISTOGRAMS
o DBA_SUBPART_COL_STATISTICS
o DBA_SUBPART_HISTOGRAMS
o INDEX_STATS 存储ANALYZE ..VALIDATE STRUCTURE统计信息
o AUX_STATS$ 存储CPU统计信息
o X$KCFIO 存储I/O统计信息
3、系统统计信息
使用DBMS_STATS.GATHER_SYSTEM_STATS收集系统统计,Oracle推荐收集系统统计。收集系统统计需要DBA权限。
收集的优化器系统统计包括:
cpuspeedNW:代表无负载CPU速度,CPU速度为每秒钟CPU周期数;通过设置gathering_mode = NOWORKLOAD或手工设置统计;单位Millions/sec。
ioseektim:I/O查找时间=查找时间+延迟时间+OS负载时间;通过设置gathering_mode = NOWORKLOAD或手工设置统计;单位为ms。
Iotfrspeed:I/O传输速度;通过设置gathering_mode = NOWORKLOAD或手工设置统计;单位为Bytes/ms.
Cpuspeed:代表有负载CPU速度,CPU速度为每秒钟CPU周期数;通过设置gathering_mode =NOWORKLOAD,INTERVAL, START|STOP或手工设置统计;单位Millions/sec。
Maxthr:最大I/O吞吐量;通过设置gathering_mode =NOWORKLOAD,INTERVAL, START|STOP或手工设置统计;单位Bytes/sec.
Slavethr:服务I/O吞吐量是平均并行服务I/O吞吐量;通过设置gathering_mode = INTERVAL,START|STOP或手工设置统计;Bytes/sec.
Sreadtim:随机读取单块的平均时间;通过设置gathering_mode =INTERVAL,START|STOP或手工设置统计;单位为ms。
Mreadtim:顺序读取多块的平均时间,通过设置通过设置gathering_mode = INTERVAL,START|STOP或手工设置统计;单位为ms。
Mbrc: 多块读平均每次读取的块数量;通过设置通过设置gathering_mode = INTERVAL,START|STOP或手工设置统计;单位为blocks。
4、数据库自动统计信息
SQL> SQL> col CLIENT_NAME for a35
SQL> col WINDOW_GROUP for a20
SQL> col status for a20
SQL> select client_name,WINDOW_GROUP,status from Dba_Autotask_Client;
CLIENT_NAME WINDOW_GROUP STATUS
----------------------------------- -------------------- --------------------
sql tuning advisor ORA$AT_WGRP_SQ ENABLED
auto optimizer stats collection ORA$AT_WGRP_OS ENABLED
auto space advisor ORA$AT_WGRP_SA ENABLED
sql tuning advisor 自动SQL调优分析
auto optimizer stats collection 自动统计信息收集
auto space advisor 自动段分析
----------------关闭自动任务
BEGIN
dbms_auto_task_admin.disable(
client_name => 'auto space advisor',
operation => NULL,
window_name => NULL);
END;
/
--------------开启自动任务
BEGIN
dbms_auto_task_admin.enable(
client_name => 'sql tuning advisor',
operation => NULL,
window_name => NULL);
END;
/
查看自动任务运行窗口
set linesize 1000 pagesize 500
col WINDOW_NAME for a30
col NEXT_TIME for a30
select WINDOW_NAME,
to_char(WINDOW_NEXT_TIME, 'yyyy-mm-dd hh24:mi:ss') NEXT_TIME,
WINDOW_ACTIVE,
OPTIMIZER_STATS,
SEGMENT_ADVISOR,
SQL_TUNE_ADVISOR
from DBA_AUTOTASK_WINDOW_CLIENTS
order by WINDOW_NEXT_TIME;
WINDOW_NAME NEXT_TIME WINDOW_ACTIVE OPTIMIZER_STATS SEGMENT_ADVISOR SQL_TUNE_ADVISOR
------------------------------ ------------------------------ --------------- ------------------------ ------------------------ ------------------------
MONDAY_WINDOW 2018-08-27 22:00:00 FALSE ENABLED ENABLED ENABLED
TUESDAY_WINDOW 2018-08-28 22:00:00 FALSE ENABLED ENABLED ENABLED
WEDNESDAY_WINDOW 2018-08-29 22:00:00 FALSE ENABLED ENABLED ENABLED
THURSDAY_WINDOW 2018-08-30 22:00:00 FALSE ENABLED ENABLED ENABLED
FRIDAY_WINDOW 2018-08-31 22:00:00 FALSE ENABLED ENABLED ENABLED
SATURDAY_WINDOW 2018-09-01 06:00:00 FALSE ENABLED ENABLED ENABLED
SUNDAY_WINDOW 2018-09-02 06:00:00 FALSE ENABLED ENABLED ENABLED
SQL> set linesize 1000 pagesize 5000
SQL> col REPEAT_INTERVAL for a70
SQL> select t1.window_name,t1.repeat_interval,t1.duration from dba_scheduler_windows t1,dba_scheduler_wingroup_members t2
2 where t1.window_name=t2.window_name and t2.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
-----禁用Windows
BEGIN
dbms_scheduler.disable(name => 'SUNDAY_WINDOW');
END;
/
------启用windows
BEGIN dbms_scheduler.enable(
name => 'SUNDAY_WINDOW');
END;
/
----修改windows属性
BEGIN
dbms_scheduler.set_attribute(
name => 'SATURDAY_WINDOW',
attribute => 'DURATION',
value => numtodsinterval(2, 'hour'));
END;
/
------删除windows
BEGIN
DBMS_SCHEDULER.REMOVE_WINDOW_GROUP_MEMBER(
group_name => 'MAINTENANCE_WINDOW_GROUP',
window_list => 'MORNING_WINDOW');
END;
/
5、统计信息收集
analyze统计:
需要使用ANALYZE统计的统计:使用LIST CHAINED ROWS和VALIDATE子句收集空闲列表块的统计;
ANALYZE table tablename compute statistics;
ANALYZE index| cluster indexname estimate statistics;
ANALYZE TABLE tablename COMPUTE STATISTICS FOR TABLE/ FOR ALL [ LOCAL] INDEXES/FOR ALL [INDEXED ] COLUMNS ;
ANALYZE TABLE tablename DELETE STATISTICS
ANALYZE TABLE tablename VALIDATE REF UPDATE
ANALYZE TABLE tablename VALIDATE STRUCTURE [ CASCADE] |[ INTO TableName]
ANALYZE TABLE tablename LIST CHAINED ROWS [ INTO TableName]
analyze table irm.E_DEVICE_PTN validate structure cascade online
注意:ANALYZE 不适合做分区表的分析
dbms_stats:
dbms_stats能良好地估计统计数据(尤其是针对较大的分区表),并能获得更好的统计结果,最终制定出速度更快的SQL执行计划。这个包的下面四个存储过程分别收集index、 table、 schema、database的统计信息 :
dbms_stats.gather_table_stats 收集表、列和索引的统计信息;
dbms_stats.gather_schema_stats 收集SCHEMA下所有对象的统计信息;
dbms_stats.gather_index_stats 收集索引的统计信息;
dbms_stats.gather_system_stats 收集系统统计信息
dbms_stats.GATHER_DICTIONARY_STATS: 所有字典对象的统计;
DBMS_STATS.GATHER_DICTIONARY_STATS 其收集所有系统模式的统计
dbms_stats.delete_table_stats 删除表的统计信息
dbms_stats.delete_index_stats 删除索引的统计信息
dbms_stats.export_table_stats 输出表的统计信息
dbms_stats.create_state_table
dbms_stats.set_table_stats 设置表的统计
dbms_stats.auto_sample_size
dbms_stats.GATHER_FIXED_OBJECTS_STATS;
查看自动统计信息是否开启,
oracle 10 g :SELECT OWNER, JOB_NAME, ENABLED FROM DBA_SCHEDULER_JOBS WHERE JOB_NAME = 'GATHER_STATS_JOB';
oracle 11 g :select t1.owner, t1.job_name, t1.enabled from dba_scheduler_jobs t1 where t1.job_name = 'BSLN_MAINTAIN_STATS_JOB' ;
---10g关闭自动统计信息命令
exec DBMS_SCHEDULER.DISABLE ('GATHER_STATS_JOB' );
BEGIN
DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB' );
END;
/
---10g启用自动统计信息命令
exec DBMS_SCHEDULER.ENABLE ('GATHER_STATS_JOB' );
-------11g 打开自动收集统计信息
BEGIN
DBMS_AUTO_TASK_ADMIN.ENABLE(
client_name => 'auto optimizer stats collection'
, operation => NULL
, window_name => NULL
);
END;
/
-------11g 关闭自动收集统计信息
BEGIN
DBMS_AUTO_TASK_ADMIN.DISABLE(
client_name => 'auto optimizer stats collection'
, operation => NULL
, window_name => NULL
);
END;
/
统计收集的权限
必须授予普通用户权限
sys@ORADB> grant execute_catalog_role to hr ;
sys@ORADB> grant connect, resource, analyze any to hr ;