表分析的几种方法

来源:互联网 发布:c语言自定义函数声明 编辑:程序博客网 时间:2024/05/31 13:16

 -----------------------------
表分析的几种方法
-----------------------------
1.analyze
2.dbms_utility
3.dbms_stats

-----------------------------
下面详细介绍几种方法
-----------------------------

一. analyze 可以收集表,索引,cluster的统计信息,这些统计信息可以是精确收集或者是估算收集。
有时候analyze的信息会不准确。metalink236935.1 解释,analyze在分析Partition表的时候,有时候会计算出不准确的Global statistics .
原因是,dbms_stats会实在的去分析表全局统计信息(当指定参数);而analyze是将表分区(局部)的statistics 汇总计算成表全局statistics ,可能导致误差。

如:
ANALYZE TABLE employees COMPUTE STATISTICS;
ANALYZE INDEX employees_pk COMPUTE STATISTICS;

ANALYZE TABLE employees ESTIMATE STATISTICS SAMPLE 100 ROWS;
ANALYZE TABLE employees ESTIMATE STATISTICS SAMPLE 15 PERCENT;

二. dbms_utility 该工具可以收集整个schema或者database全部的统计信息。

如:
EXEC DBMS_UTILITY.analyze_schema('SCOTT','COMPUTE');
EXEC DBMS_UTILITY.analyze_schema('SCOTT','ESTIMATE', estimate_rows => 100);
EXEC DBMS_UTILITY.analyze_schema('SCOTT','ESTIMATE', estimate_percent => 15);

EXEC DBMS_UTILITY.analyze_database('COMPUTE');
EXEC DBMS_UTILITY.analyze_database('ESTIMATE', estimate_rows => 100);
EXEC DBMS_UTILITY.analyze_database('ESTIMATE', estimate_percent => 15);

三. dbms_stats 该工具是oracle推荐使用的。它可以并行收集信息。
它可以并行分析;
它有自动分析功能(alter table monitor的功能必须启动)

如:
EXEC DBMS_STATS.gather_database_stats;
EXEC DBMS_STATS.gather_database_stats(estimate_percent => 15);

EXEC DBMS_STATS.gather_schema_stats('SCOTT');
EXEC DBMS_STATS.gather_schema_stats('SCOTT', estimate_percent => 15);

EXEC DBMS_STATS.gather_table_stats('SCOTT', 'EMPLOYEES');
EXEC DBMS_STATS.gather_table_stats('SCOTT', 'EMPLOYEES', estimate_percent => 15);

EXEC DBMS_STATS.gather_index_stats('SCOTT', 'EMPLOYEES_PK');
EXEC DBMS_STATS.gather_index_stats('SCOTT', 'EMPLOYEES_PK', estimate_percent => 15);
This package also gives you the ability to delete statistics:

EXEC DBMS_STATS.delete_database_stats;
EXEC DBMS_STATS.delete_schema_stats('SCOTT');
EXEC DBMS_STATS.delete_table_stats('SCOTT', 'EMPLOYEES');
EXEC DBMS_STATS.delete_index_stats('SCOTT', 'EMPLOYEES_PK');

-----------------------------
这是对命令与工具包的一些总结
-----------------------------

1.如果想分析整个用户或数据库,还可以采用工具包,可以并行分析
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);



2.对于分区表,建议使用DBMS_STATS,而不是使用Analyze语句。
a) 可以并行进行,对多个用户,多个Table
b) 可以得到整个分区表的数据和单个分区的数据。
c) 可以在不同级别上Compute Statistics:单个分区,子分区,全表,所有分区
d) 可以倒出统计信息
e) 可以用户自动收集统计信息

3.DBMS_STATS的缺点
a) 不能Validate Structure
b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,这两个仍旧需要使用Analyze语句。
c) DBMS_STATS 默认不对索引进行Analyze,因为默认Cascade是False,需要手工指定为True

4.对于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS来收集信息。

-----------------------------
结尾:
-----------------------------

在10g文档中,analyze的功能已经明确,它不会收集和CBO相关的信息。所以推荐使用dbms_stats.在收集与CBO优化器不相关的统计信息的时候ANALYZE语句要优于DBMS_STATS包


-----------------------------
补充:关于alter table monitor
-----------------------------

这个功能可以监控DML的操作(insert/update/delete/truncate)在某些表上。
命令是启用: alter table TABLE_NAME monitoring

monitor启动后,可以通过sys.DBA_TAB_MODIFICATIONS (based on sys.mon_mods$ table)来查看
这个视图中的数据,是最近一次分析后的累积值。 即当每次做分析的时候,这个视图中的数据会被清空。

这个monitor的功能在9i的时候默认是关闭的,必须要用alter table monitor启动。 在10g的时候,是默认开通的。
打开此项监控对于性能来说没有太多影响,因为这项机制是工作在内存,并周期性的对DBA_TAB_MODIFICATIONS视图进行刷新。

 

原创粉丝点击