如何正确地分析Oracle数据库模式,表及索引
在Oracle
数据库中,我们经常需要去手工分析表和索引,还有某个模式下所有的表和索引等等。oracle
提供了两种分析方法,分别是dbms_stats
包和analyze
命令。这些是我们在日常项目管理中的真实使用的方法,供参考。
在10g
中分析某一个用户下所有的对象,如user_miki
用户
sys.dbms_stats.gather_schema_stats(ownname => 'user_miki',estimate_percent => 30,method_opt => 'FOR ALL INDEXED COLUMNS SIZE AUTO',cascade => true,options => 'GATHER');
这是我在项目中分析一个用户所有对象的分析方法,取样比例为30%
,分析所有索引字段,生成柱形图,并且也分析索引。
(miki西游 @mikixiyou 文档,原文链接: http://mikixiyou.iteye.com/blog/1553986
)
在10g
中分析某一个用户下某一个表及其索引,如user_miki
用户下info
表和它的索引
execute dbms_stats.gather_table_stats(ownname => 'user_miki',tabname => 'info',estimate_percent => 30,method_opt => 'for all indexed columns size auto');
这是我在项目中单独分析一个用户中一张表的分析方法,取样比例为30%
,分析所有索引字段,生成柱形图,并且也分析索引。
我们在google
时,还能看到使用analzye
命令分析表的方法。
analyze table
table_name compute statistics;
这个会将索引和表一起分析;
analyze table table_name compute statistics for table;
这个仅分析表;
analyze table table_name compute statistics for all columns;
这个仅分析表,和上面所有的字段,生成柱形图
analyze table table_name compute statistics for all indexed columns;
这个仅分析表,和上面所有建立索引的字段,生成柱形图
在9i
中,我们常常使用analyze
方法,在10g
以后,就改为dbms_stats.gather_schema_stats
类似的包来分析数据库对象了。
10g
的分析函数包比9i
的analyze
方法更灵活一些。
在10g
中,会有个系统的计划任务,每天10
点和周末两天都自动分析新的数据库对象和它认为统计信息已经过期的数据库对象。这个分析结果有时候不靠谱。
因此,我都采用10g
中提供的dbms_stats.gather_schema_stats
方法作为补充,设置一个计划任务定期去分析业务用户下所有数据库对象。
1 楼
mikixiyou
2012-06-07
dbms_stats中采样的比例是需要根据实际情况来设定的,这点忘记说。
如果分析时间太长,就放到周末,每周一次,采用比例可以适当下降,但不能影响到CBO优化器。
2 楼
wl296784423
2012-06-07
引用
[img][/img][url][/url][u][/u][i][/i][b][/b]sdfasd
3 楼
mikixiyou
2012-06-07
wl296784423 写道
引用
[img][/img][url][/url][u][/u][i][/i][b][/b]sdfasd
这是什么?
4 楼
wl296784423
2012-06-07
mikixiyou 写道
wl296784423 写道
引用
[img][/img][url][/url][u][/u][i][/i][b][/b]sdfasd
这是什么?
瞎打的哈哈!