我们可以查看数据字典和动态性能视图的相关信息,如下
select view_name from dba_views where view_name like 'DBA%' order by 1;
select name from V$FIXED_TABLE order by 1;
数据字典视图有两个字段,一列描述对象的特征,一列是动态的收集过来的对象的信息。如DBA_TABLE中有关于表的物理结构的字段(TABLESPACE_NAME、PCT_free、INITIAL_EXTENT),这些字段会告诉你表的统计信息(如NUM_ROW、AVG_SPACE、AVG_ROW_Len)。要收集这些统计数据,我们必须执行分析语句。对于表,我们将执行以下语句:
ANALYZE TABLE hr.employees COMPUTE STATISTICS;
为了加速(speed up)和自动化对许多对象的分析,可以使用DBMS_UTILITY. analyze_schema或者DBMS_UTILITY.analyze_database去分析用户下的对象:
EXEC DBMS_UTILITY.analyze_schema('HR','COMPUTE’);
对于ANALYZE命令和DBMS_UTILITY函数,这是摆在我们面前的两个选择。Oracle建议使用DBMS_STATS包,因为它更快更准,而且它允许并行删除统计信息、导出、导入和收集统计信息。下面的语句分析了HR用户:
exec DBMS_STATS.Gest_SCHEMA_STATS(‘HR’);
同样,我们可以收集表、索引或数据库的统计信息:
EXEC DBMS_STATS.gather_database_stats(estimate_percent => 20);
EXEC DBMS_STATS.gather_table_stats('HR', 'EMPLOYEES');
EXEC DBMS_STATS.gather_index_stats('HR', 'EMP_JOB_IX');
使用DBMS_STATS包,我们还可以删除统计信息:
exec DBMS_STATS.DELETE_TABLE_STATS(‘HR’,‘Employees’);
我们还可以从A库中,把目标的统计信息数据拿到B库中来分析研究。要在不同数据库之间传输统计信息,必须使用统计数据表,如下步骤所示:
1.在源数据库上创建统计表
2.将统计数据从数据字典导出到统计表
3.将统计表(导出/导入、Datapump、Copy)移动到目标数据库
4.将统计数据从统计表导入数据字典
5.删除统计表
在源库中执行:
EXEC DBMS_STATS.create_stat_table('DBA_SCHEMA', 'MY_STAT_TABLE');
EXEC DBMS_STATS.export_schema_stats('DBA_SCHEMA','MY_STAT_TABLE',NULL, 'APP_SCHEMA');
以上我们在DBA_SCHEMA用户中创建了存放统计信息的表MY_STAT_TABLE,并将APP_SCHEMA用户中的统计信息数据写进去。
然后,我们用数据泵将MY_STAT_TABLE表转移到目标数据库,我们从源数据库导出表,然后将表导入目标数据库,在目标数据库中执行以下语句:
EXEC DBMS_STATS.import_schema_stats('APP_SCHEMA','MY_STAT_TABLE',NULL,'DBA_SCHEMA');
EXEC DBMS_STATS.drop_stat_table('DBA_SCHEMA', 'MY_STAT_TABLE');
在这个例子中,已经转移了关于整个APP_SCHEMA的统计信息。我们可以用DBMSESTATS数据包的import-*和export-*程序选择为整个数据库、一个表、一个索引或一个列传输统计信息。





