每天进步一点点

数据库分析表的用法及作用总结

上一篇 / 下一篇  2013-01-30 09:49:54 / 个人分类:数据库

 
在现场出差时,割接脚本中有分析表的语句,在网上找了下与分析表相关的知识:
 
1、分析表的基本SQL语法:
analyze table tablename(表名) compute statistics
也等同于 analyze table tablename compute statistics for table for all indexes for all columns

for table的统计信息存在于视图:user_tables 、all_tables、dba_tables
for all indexes的统计信息存在于视图: user_indexes 、all_indexes、dba_indexes
for all columns的统计信息存在于试图:user_tab_columns、all_tab_columns、dba_tab_columns
删除分析SQL:
analyze table tablename delete statistics 会删除所有的statistics

2、Oracle分析表的作用:
分析更新表的统计信息,为了使基于CBO的执行计划更加准确(了解CBO,可先百度);
定期分析表的话可以获得这些表中数据的比较准确的统计信息,这样oracle优化器在选择执行计划时偏差就会小一些。

如果想分析整个用户或数据库,还可以采用工具包,可以并行分析
Dbms_utility(8i以前的工具包)
Dbms_stats(8i以后提供的工具包)

dbms_stats.gather_schema_stats(User,estimate_percent=>100,cascade=> TRUE);
dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);

dbms_stats的作用主要是替代analyze的收集统计信息这一块的功能,且在这一方面做了相当大程度上的增强。
以analyze table tablename compute statistics;这条为例,生成的统计信息会存在于user_tables这个视图,查看一下
select * from user_tables where table_name=tablename;
观察一下NUM_ROWS,BLOCKS,AVG_SPACE,AVG_ROW_LEN几列你就会明白,这就是分析表后数据库的变化。

3、对命令与工具包的一些总结:
(1)、对于分区表,建议使用DBMS_STATS,而不是使用Analyze语句。
a) 可以并行进行,对多个用户,多个Table
b) 可以得到整个分区表的数据和单个分区的数据。
c) 可以在不同级别上Compute Statistics:单个分区,子分区,全表,所有分区
d) 可以导出统计信息
e) 可以用户自动收集统计信息
(2)、DBMS_STATS的缺点
a) 不能Validate Structure
b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,这两个仍旧需要使用Analyze语句。
c) DBMS_STATS 默认不对索引进行Analyze,因为默认Cascade是False,需要手工指定为True
(3)、对于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS来收集信息.

TAG:

 

评分:0

我来说两句

Open Toolbar