--统计信息
--收集schame的统计信息
begin
dbms_stats.gather_schema_stats(ownname => 'DATACHG',
estimate_percent => dbms_stats.auto_sample_size,
cascade => true,
method_opt => 'FOR ALL COLUMNS SIZE auto',
degree => 8);
end;
/
--收集表统计信息
begin
dbms_stats.gather_table_stats(ownname => 'LIS',
tabname => 'LACOMMISION',
estimate_percent => dbms_stats.auto_sample_size,
cascade => true,
method_opt => 'FOR ALL COLUMNS SIZE auto',
degree => 8);
end;
/
--查看系统自动收集统计信息的job:
SELECT * FROM dba_scheduler_jobs WHERE job_name = 'GATHER_STATS_JOB';
--disable自动收集统计信息:
BEGIN
dbms_scheduler.disable('GATHER_STATS_JOB');
END;
--enable自动收集统计信息:
BEGIN
dbms_scheduler.enable('GATHER_STATS_JOB');
END;
--表统计;
--行数,块数,行平均长度;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;
--查看统计信息的时间及表的记录数
select owner,table_name,last_analyzed,num_rows from dba_tables where owner='LIS' and table_name='LAAGENT';
--last_analyzed:相关表的信息最后被统计的时间
--num_rows:优化器中存放的 表中的 记录数(可能与实际情况不符)
--是否对表进行了分析(如果结果为空,说明没有对表进行分析)
select num_rows, avg_row_len, blocks, last_analyzed
from dba_tables
where table_name='SE_PAYMENTS';
--检查Oracle统计信息是否陈旧
select * from dba_tab_statistics order by last_analyzed desc;
select owner,table_name,num_rows,last_analyzed,stale_stats from dba_tab_statistics order by last_analyzed desc;
--查询统计信息时间
alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';
select table_name,last_analyzed from dba_tables where owner='LIS';
--收集全库的统计信息参数理解
exec dbms_stats.gather_database_stats(estimate_percent=>10,degree=>8,cascade=>true,granularity=>'ALL');
--统计信息收集:
--收集统计信息是一项复杂任务,需谨慎,示例对给出用户、索引名的对象采集统计信息
exec dbms_stats.gather_table_stats(ownname=>'&owner',tablename=>'&table_name');
exec dbms_stats.gather_index_stats(ownname=>'&owner',indexname=>'&index_name');
--创建指定方案的统计信息表
exec dbms_stats.create_stat_table(ownname => 'lis',stattab => 'stab_20180630');
--导出指定方案的统计信息
exec dbms_stats.export_schema_stats(ownname=> 'LIS',stattab=>'stab_20180630');
--收集指定表统计信息
SET TIMING ON;
EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=> 'LIS',TABNAME=>'LJAGETENDORSE', CASCADE => TRUE, GRANULARITY=> 'AUTO', FORCE=> TRUE,DEGREE=> 4);
EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=> 'LIS',TABNAME=>'LJAGET', CASCADE => TRUE, GRANULARITY=> 'AUTO', FORCE=> TRUE,DEGREE=> 4);
SET TIMING OFF;
--说明:
--默认及常用(表示对出现在where条件中的列自动判断是否收集直方图)
method_opt => 'FOR ALL COLUMNS SIZE auto'
--系统稳定(表示前面哪些列收集了直方图,现在就收集哪些列的直方图)
method_opt => 'FOR ALL COLUMNS SIZE repeat'
--不用(表示对表中所有列收集直方图)
method_opt => 'FOR ALL COLUMNS SIZE skewonly'
--不用(表示删除表中所有列的直方图)
method_opt => 'FOR ALL COLUMNS SIZE 1'
--1)estimate_percent:
--这个参数表示选择的采样比例,如果太低,收集速度会快,但可能不会很准确,如果太高,收集速度会慢,但比较准确,各有利弊。表示选择的采样比例,如果太低,收集速度会快,但可能不会很准确,如果太高,收集速度会慢,但比较准确,各有利弊,默认是100%。
--2)degree
--并行统计信息收集,应该根据对象的大小和并行性初始化参数的设置选择恰当的并行度,默认为null
--3)cascade
--这个参数表示是否收集表对应的索引、列等的统计信息
--4)granularity
--这个参数有四个值
--① ALL:采集Global、partition、subpartition等粒度统计信息
--② AUTO:根据分区类型,由Oracle确定统计信息采集粒度
--③ PARTITION:只采集partition粒度统计信息
--④ SUBPARTITION:只采集subpartition粒度统计信息