情景:统计信息直接影响到Oracle优化器最后的执行计划,每次升完级或者数据迁移成功后都会习惯性的做一次统计信息收集。但是对于一些大表,比如数据量超过几千万条,表分析后却有可能会导致应用系统一些SQL执行计划变差,比如出现大量的全表扫,严重影响数据库性能。
分析:
1. 什么是统计信息?
统计信息主要是 描述数据库[url=][/url]中表,索引的大小,规模,数据分布状况等的一类信息。比如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于统计信息。CBO正是根据这些统计信息数据,计算出不同访问路径下,各种计划的成本,最后选择出成本最小的计划。统计信息是存放在数据字段表中的,如tab$。一般我们从数据字段视图中察看统计信息状况,如DBA_TABLES,DBA_INDEXES,DBA_TAB_COL_STATISTICS, DBA_TAB_HISTOGRAMS 等。
如下图,描述了该表的统计信息的的行数,块数(同理如果要查索引相关就使用DBA_INDEXES,):
2、如何备份统计信息?
一想到备份开始想到的就是expdp、rman,但统计信息是使用存储过程进行备份的
下面我做了一个实验:
(1)先查询病人信息表的统计信息
(2)在系统中创建统计信息表ZLHIS_DY3
(3)备份ZLHIS用户的统计信息
(4)ZLHIS用户统计信息收集
Begin
dbms_stats.gather_schema_stats(ownname => 'ZLHIS',cascade => true ,estimate_percent => 10,method_opt => 'for all indexed columns');
end;
注:开始叫想,这里的统计信息收集是否会覆盖或者摧毁开始备份表中ZLHIS_DY3里面的统计信息?显然是不会的,因为这里的收集只是收集块数,行数,而ZLHIS_DY3记录的是真正的数字。
(5)再查看病人信息统计信息变化
(6)还原统计信息
(7)查看还原成功的统计信息
总结:
备份统计细信息:
--创建统计信息历史保留表 sql> exec dbms_stats.create_stat_table(ownname => 'ZLHIS',stattab => 'ZLHIS_DY2') ;
--导出整个scheme的统计信息 ,该scheme可以用来恢复用户、索引、以及表的统计信息,十分重要
sql> exec dbms_stats.export_schema_stats(ownname => 'ZLHIS',stattab => 'ZLHIS_DY2') ;
恢复统计信息按用户恢复:
sql> exec dbms_stats.import_schema_stats(ownname => 'ZLHIS',stattab => 'ZLHIS_DY2');
或者
BEGIN
DBMS_STATS.IMPORT_SCHEMA_STATS(
ownname => 'ZLHIS', stattab => 'ZLHIS_DY2'
);
END;
/
恢复统计信息按表恢复:
exec dbms_stats.import_table_stats(ownname => 'ZLHIS',tabname => '表名',stattab => '备份统计信息的表名') ;
分析:
1. 什么是统计信息?
统计信息主要是 描述数据库[url=][/url]中表,索引的大小,规模,数据分布状况等的一类信息。比如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于统计信息。CBO正是根据这些统计信息数据,计算出不同访问路径下,各种计划的成本,最后选择出成本最小的计划。统计信息是存放在数据字段表中的,如tab$。一般我们从数据字段视图中察看统计信息状况,如DBA_TABLES,DBA_INDEXES,DBA_TAB_COL_STATISTICS, DBA_TAB_HISTOGRAMS 等。
如下图,描述了该表的统计信息的的行数,块数(同理如果要查索引相关就使用DBA_INDEXES,):
2、如何备份统计信息?
一想到备份开始想到的就是expdp、rman,但统计信息是使用存储过程进行备份的
下面我做了一个实验:
(1)先查询病人信息表的统计信息
(2)在系统中创建统计信息表ZLHIS_DY3
(3)备份ZLHIS用户的统计信息
(4)ZLHIS用户统计信息收集
Begin
dbms_stats.gather_schema_stats(ownname => 'ZLHIS',cascade => true ,estimate_percent => 10,method_opt => 'for all indexed columns');
end;
注:开始叫想,这里的统计信息收集是否会覆盖或者摧毁开始备份表中ZLHIS_DY3里面的统计信息?显然是不会的,因为这里的收集只是收集块数,行数,而ZLHIS_DY3记录的是真正的数字。
(5)再查看病人信息统计信息变化
(6)还原统计信息
(7)查看还原成功的统计信息
总结:
备份统计细信息:
--创建统计信息历史保留表 sql> exec dbms_stats.create_stat_table(ownname => 'ZLHIS',stattab => 'ZLHIS_DY2') ;
--导出整个scheme的统计信息 ,该scheme可以用来恢复用户、索引、以及表的统计信息,十分重要
sql> exec dbms_stats.export_schema_stats(ownname => 'ZLHIS',stattab => 'ZLHIS_DY2') ;
恢复统计信息按用户恢复:
sql> exec dbms_stats.import_schema_stats(ownname => 'ZLHIS',stattab => 'ZLHIS_DY2');
或者
BEGIN
DBMS_STATS.IMPORT_SCHEMA_STATS(
ownname => 'ZLHIS', stattab => 'ZLHIS_DY2'
);
END;
/
恢复统计信息按表恢复:
exec dbms_stats.import_table_stats(ownname => 'ZLHIS',tabname => '表名',stattab => '备份统计信息的表名') ;