觀察analyze table compute statistics 都對什麼物件統計了資訊 - 轉

ningzi82發表於2010-10-19
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.

[@more@]

觀察analyze table

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來收集資訊。

==================================================================

轉:http://bianxq.javaeye.com/blog/464679

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/789833/viewspace-1039979/,如需轉載,請註明出處,否則將追究法律責任。

相關文章