观察analyze table compute statistics 都对什么对象统计了信息
analyze table compute statistics = analyze table compute statistics for table for all indexes for all columns; 比analyze table compute statistics for table for all indexes for all indexed columns 分析了更多的信息 但这里并不是鼓励使用 analyze table 的方法进行分析。
SQL> create table t as select * from all_objects; Table created.
SQL> create index t_idx on t(object_id); Index created.
SQL> analyze table t compute statistics for table 2 for all indexes for all indexed columns;
Table analyzed.
SQL> select t.num_rows, i.num_rows, c.cnt 2 from (select num_rows from user_tables where table_name = 'T') t, 3 (select num_rows from user_indexes where table_name = 'T' ) i, 4 (select count(distinct column_name) cnt from user_tab_histograms where tab le_name = 'T' ) c 5 /
NUM_ROWS NUM_ROWS CNT ---------- ---------- ---------- 31213 31213 1 《------在这里 因为只有1列建立有索引,因此user_tab_histograms 只统计了object_id列的数据分布,这里object_id因为唯一,所以是均匀分布的
SQL> analyze table t delete statistics;
Table analyzed.
SQL> select t.num_rows, i.num_rows, c.cnt 2 from (select num_rows from user_tables where table_name = 'T') t, 3 (select num_rows from user_indexes where table_name = 'T' ) i, 4 (select count(distinct column_name) cnt from user_tab_histograms where ta ble_name = 'T' ) c;
NUM_ROWS NUM_ROWS CNT ---------- ---------- ---------- 0
SQL> analyze table t compute statistics;
Table analyzed.
SQL> select t.num_rows, i.num_rows, c.cnt 2 from (select num_rows from user_tables where table_name = 'T') t, 3 (select num_rows from user_indexes where table_name = 'T' ) i, 4 (select count(distinct column_name) cnt from user_tab_histograms where ta ble_name = 'T' ) c;
NUM_ROWS NUM_ROWS CNT ---------- ---------- ---------- 31213 31213 13 〈------统计了所有的列,但这些列并不是都用在 where col='X' 上的,因此很多信息其实都没有实际意义。
DBMS_STATS 和TABLE的MONITOR结合,可以当表数据量发生10%的变化的时候,自动重新收集统计信息。 我平常更喜欢使用SIZE SKEWONLY 分析histograms
========================================================================== analyze table t compute statistics = analyze table t 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 当analyze table t delete statistics 会删除所有的statistics
===========================================================================[Q]怎么样分析表或索引 [A]命令行方式可以采用analyze命令 如Analyze table tablename compute statistics; Analyze index|cluster indexname estimate statistics; ANALYZE TABLE tablename COMPUTE STATISTICS FOR TABLE FOR ALL [LOCAL] INDEXES FOR ALL [INDEXED] COLUMNS; ANALYZE TABLE tablename DELETE STATISTICS ANALYZE TABLE tablename VALIDATE REF UPDATE ANALYZE TABLE tablename VALIDATE STRUCTURE [CASCADE]|[INTO TableName] ANALYZE TABLE tablename LIST CHAINED ROWS [INTO TableName] 等等。 如果想分析整个用户或数据库,还可以采用工具包,可以并行分析 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); 这是对命令与工具包的一些总结 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来收集信息。
================================================================== |