10g的统计信息手动收集方法
除系统自动收集统计信息外,还可以通过手动调用包来收集统计信息
常用的包如下
dbms_stats.gather_table_stats();--收集指定表的统计信息
常用参数
Tabname –表名称
Partname—分区名称
estimate_percent—统计的样品比例,默认oracle自动选择
method_opt –统计方式,默认FOR ALL COLUMNS SIZE AUTO.
degree –并行度
cascade—是否级联收集索引信息,默认是不收集的
dbms_stats.gather_index_stats();--收集指定索引的统计信息
另外还有一个收集统计信息的命令analyze
analyze table t1 compute statistics –收集表统计信息
以上包或命令常用在对单个对象收集信息,当对象较多或者需要对某个用户下的某类对象进行收集信息就要用到下面的包
dbms_stats.gather_schema_stats();--收集指定用户的统计信息
常用参数
Ownname –用户名称
estimate_percent—抽样比例,默认oracle自动选择
method_opt--统计方式,默认FOR ALL COLUMNS SIZE AUTO.
Degree –并行度
Granularity—收集统计信息的级别默认auto
-- 'AUTO' – 由过程自动决定收集的级别
-- 'GLOBAL AND PARTITION' – 收集全局以及分区信息
-- 'SUBPARTITION' – 收集子分区信息
-- 'PARTITION' – 收集分区信息
-- 'GLOBAL' – 收集全局信息
-- 'ALL' - 收集全局、分区、子分区信息
Cascade—是否收集索引信息,默认由oracle决定
options – 指定收集的对象
-- 'GATHER' – 收集用户的所有对象信息
-- 'GATHER AUTO' – 由oracle决定收集哪些对象
-- 'GATHER STALE' – 收集视图 user_tab_modifications 中的对象信息与系统自动收集的策略一致
-- 'GATHER EMPTY' – 收集当前统计信息为空的对象信息
在自动收集策略中也提到了一个收集统计信息的包
DBMS_STATS.GATHER_DATABASE_STATS_JOB_PRO()
这个包的统计原理是统计数据库中统计信息过久或者缺失或者对象在统计时间段内数据量变化大于10%(可以累积)
监控对象修改数据量的视图
select * from user_tab_modifications
对象中的数据发生变化后并不会立即进入到user_tab_modifications,可以利用以下包手工刷新
begin
Dbms_Stats.flush_database_monitoring_info();
end;
手动调用收集统计信息
begin
dbms_stats.gather_database_stats_job_proc();--通过实验发现对于分区表,只收集分区表的信息,全表的不收集(需要通过修改时间触发自动收集job才会收集全表的信息)
end;
当分区表修改数据量达到10%但没到全表的10%,则只收集分区表的信息,不收集全表的信息,当达到全表的10%则会收集全表的信息。
修改量可以累积当累积到10%后也会触发收集。
dbms_stats.gather_schema_stats()中的参数‘GATHER STALE'也是利用通过监控这个视图中的数据来决定收集的对象。
在收集统计信息时可能出现原来的优化方法在收集统计信息之前一直工作良好,但是在此之后,由于新收集的统计信息产生了不良计划,导致查询突然出错或效率降低。为避免这种情况,统计信息的收集作业在收集新信息之前保存当前的统计信息。如果出现问题,则可以返回到原有的统计信息,或者通过历史统计 检查二者之间的不同之处,以解决问题。
查询系统保存统计信息时长
select DBMS_STATS.GET_STATS_HISTORY_RETENTION from dual;
查询最早可用的统计信息时间
select DBMS_STATS.GET_STATS_HISTORY_AVAILABILITY from dual;
还原统计用户统计信息
begin
dbms_stats.restore_schema_stats
(user,'09-6月 -16 10.26.32.927000000 下午 +08:00');
end;
在利用系统自动保存的信息进行还原的同时也可以利用命令手动导入导出用户统计信息
--创建收集统计信息的表stattab
begin
dbms_stats.create_stat_table('scott','stattab','users');
end;
--将用户统计信息导出到统计信息表stattab
begin
dbms_stats.export_schema_stats
(
ownname=>'scott',stattab=>'stattab',statown=>'scott'
);
end;
--收集用户的统计信息
begin
dbms_stats.gather_schema_stats
(
'scott',method_opt=>'for all columns',degree=>4
);
end;
--将用户统计信息还原
begin
dbms_stats.import_schema_stats
(ownname=>'scott',STATTAB=>'stattab',statown=>'scott');
end;