Oracle对表的分析
在我看来分析数据库表是为了获取表的统计信息,以便数据库在对表进行查询等操作的时候选择正确的执行路径,那么什么时候需要对数据库表进行分析呢?在我看来主要是下面的情况:
1.数据以分区交换的方式加载到数据库中,并且在加载入库后不再改变。
www.2cto.com
这种情况最好是在交换之后再进行分析,因为如果先分析临时表之后再交换,那么交换之后临时表中的分析信息只是作为分区表的分区信息交换进去,而分区表的全局信息并没有更新。分区表的全局信息可以在这两个表(表与索引)中查到:
SELECT * FROM USER_TABLES;
SELECT * FROM USER_INDEXES;
在未分析之前大多数字段是空的,你可以使用下面的语句对表进行分析:
ANALYZE TABLE TABLENAME COMPUTE STATISTICS;
ANALYZE INDEX | CLUSTER INDEXNAME ESTIMATE STATISTICS;
或者使用工具包(对于分区表推荐使oracle账号用工具包,可以满足不同的需求,得到整个分区表或者单个分区的数据,在不同级别上对分区表进行统计,但是不能收集CHAINED ROWS和CLUSTER TABLE的信息): www.2cto.com
DBMS_STATS.GATHER_SCHEMA_STATS(USER, ESTIMATE_PERCENT => 100, CASCADE => TRUE);
DBMS_STATS.GATHER_TABLE_STATS(USER, TABLENAME, DEGREE => 4, CASCADE => TRUE);
单个分区的分区信息可以在下面的两个表(表与索引)中查到:
SELECT * FROM USER_TAB_PARTITIONS;
SELECT * FROM USER_IND_PARTITIONS;
全局的分析信息在跨分区查询的时候显得尤为重要,这也是推荐我们在进行分区交换之后再对表进行分析的原因。
2.第二种需要对表进行分析的情况是:数据存在表中并且经常改变。