对于Oracle CBO 来说,SQL语句的执行计划完全依靠于准确的统计信息

除了自动的统计信息分析外,我们可以手动进行分析

下面主要是举例来说,具体命令的参数可参考官方文档

https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_stats.htm#i1036461

http://www.cnblogs.com/wbzhao/archive/2012/04/05/2433616.html

1. 使用analyze分析

analyze table dcwip.wip_activity compute statistics;

2. 使用Oracle包分析

2.1 备份现有统计信息:

这里首先创建用于保存现有统计信息的表

exec dbms_stats.create_stat_table(ownname => 'fwassy',stattab => 'qagatedata_static');

exec dbms_stats.create_stat_table(ownname => 'mesinterface',stattab => 'mesinterface_plan');

exec dbms_stats.create_stat_table(ownname => 'fwassy',stattab => 'fwassy_statics');

2.2 导出表的统计信息

这里导出现有执行计划

exec dbms_stats.export_table_stats(ownname=>'fwassy',tabname=>'RPt_scrap',stattab=>'fwassy_plan',statid => 'RPt_scrap');

exec dbms_stats.export_table_stats(ownname=>'fwassy' ,tabname=>'FWCATNS_PACKAGE',stattab=> 'fwassy_statics',statid => 'id_FWCATNS_PACKAGE' );

2.3 导出schema的统计信息

这里也可以导出整个schema的统计信息

exec dbms_stats.export_schema_stats(ownname => 'fwft',stattab => 'fwft_plan');

2.4 收集表和索引的统计信息

这里开始收集统计信息

exec dbms_stats.gather_table_stats(ownname => 'fwass',tabname => 'RPt_scrap' ,estimate_percent=>dbms_stats.auto_sample_size,degree =>3, cascade => true,statown => 'fwft' , stattab => 'fwwip_static')

exec dbms_stats.gather_table_stats(ownname => 'fwassy',tabname => 'FWCATNS_ASSY_ROUTING_EDITION',estimate_percent=>100, method_opt => 'for all columns size AUTO', degree =>3, cascade => true)

 exec dbms_stats.gather_table_stats(ownname => 'acs_assy',tabname => 'DOWN_RECORD',estimate_percent=>dbms_stats.auto_sample_size, method_opt => 'for all columns size AUTO', degree =>3, cascade => true)

2.5 分析Schema:

exec dbms_stats.gather_schema_stats(ownname => 'test',options => 'GATHER AUTO',estimate_percent => dbms_stats.auto_sample_size,method_opt => 'for all indexed columns', degree => 6 );

3. 恢复统计信息

如果发现执行计划走错,我们需要恢复原来的统计信息

3.1 删除表的统计信息

如果原来没有统计信息可以选择删除它

exec dbms_stats.delete_table_stats(ownname => 'TEST',tabname => 'SM_USER') ;

3.2 导入统计信息

exec dbms_stats.import_index_stats(ownname => 'TEST',indname => 'PK_USER_INDEX',stattab => 'stat_table')

exec dbms_stats.import_table_stats(ownname => 'fwassy', tabname => 'fwcatns_package', stattab => 'fwassy_statics' , statid => 'id_fwcatns_package', no_invalidate => true );

4. 查看表的统计信息

4.1 查看表或索引是否已分析

SELECT * FROM DBA_TABLES WHERE  TABLE_NAME = 'FWCATNS_PACKAGE';

SELECT * FROM DBA_INDEXES WHERE  INDEX_NAME = 'IDX_FWCATNS_PACKAGE';

4.2 查看保存统计信息的表

select * from fwassy.fwassy_statics