每天进步一点点
数据库分析表的用法及作用总结
上一篇 /
下一篇 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: