【調優篇基本原理】物件統計資訊

yellowlee發表於2010-07-21

物件統計資訊用來描述資料是如何在資料庫中儲存的,有表統計,列統計,索引統計。先不看分割槽相關的內容,分割槽相關內容在分割槽專題中分析和實驗。

Oracle中有一些表或者檢視的可以檢視這些資訊:

User_taball_tabdba_tab打頭的表相關的,user_tab_colall_tab_coldba_tab_col打頭的列相關的,user_ind,all_ind,dba_ind打頭的索引相關的,比如

User_tab_statistics

User_tables

User_tab_col_statistics

User_tab_histograms

User_ind_statistics

User_indexes

簡單看看相關的欄位資訊:

建立一個表:

create table t_test_statistics1  as select * from dba_tables ;

SQL> set linesize 200

SQL> select a.object_type,

  2         a.num_rows,

  3         a.blocks,

  4         a.empty_blocks,

  5         a.avg_space,

  6         a.chain_cnt,

  7         a.avg_row_len,

  8         a.last_analyzed,

  9         a.stale_stats

 10    from user_tab_statistics a

 11   where a.table_name = upper('t_test_statistics1');

 

OBJECT_TYPE    NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN LAST_ANAL STA

------------ ---------- ---------- ------------ ---------- ---------- ----------- --------- ---

TABLE

 

SQL>

SQL> select a.table_name,a.column_name,a.num_distinct

  2    from user_tab_col_statistics a

  3   where a.table_name = upper('t_test_statistics1');

 

no rows selected

 

SQL>

可以看到新建立的表並沒有相關的統計資訊,比如:

行數num_rows

塊數blocks

空塊數empty_block,

平均行的空間avg_space

行連結數量chain_cnt

平均行長度avg_row_len,

最後分析時間last_analyzed,

統計資訊是否陳舊stale_stats.

 

同時也發現並沒有相應列的統計資訊。

 

接著在表上建立一個索引:

SQL>  create index idx_test_stat_name on t_test_statistics1(table_name);

 

Index created

 

 

SQL> select a.blevel, 

  2         a.leaf_blocks,

  3         a.distinct_keys,

  4         a.avg_leaf_blocks_per_key,

  5         a.avg_data_blocks_per_key,

  6         a.avg_cached_blocks,

  7         a.avg_cache_hit_ratio,

  8         a.clustering_factor,

  9         a.num_rows,

 10         a.last_analyzed,

 11         a.stale_stats

 12    from user_ind_statistics a

 13   where a.index_name = upper('idx_test_stat_name');

 

 

    BLEVEL LEAF_BLOCKS DISTINCT_KEYS AVG_LEAF_BLOCKS_PER_KEY AVG_DATA_BLOCKS_PER_KEY AVG_CACHED_BLOCKS AVG_CACHE_HIT_RATIO CLUSTERING_FACTOR   NUM_ROWS LAST_ANAL STA

---------- ----------- ------------- ----------------------- ----------------------- ----------------- ------------------- ----------------- ---------- --------- ---

         1          10          2298                       1                       1                                               1103        2309 22-JUL-10

 

SQL>

可以看到,在建立索引的時候便產生了索引相關的統計資訊,包括:

Blevel   索引高度

Leaf_blocks   葉塊數

Distinct_keys 不同的鍵值數

avg_leaf_blocks_per_key 鍵值平均葉塊數

avg_data_blocks_per_key 鍵值平均資料塊數

avg_cached_blocks       平均快取的塊數

avg_cache_hit_ratio    平均快取的命中率

clustering_factor  索引叢集因子

num_rows 行數

last_analyzed 最後分析時間

stale_stats   是否陳舊

 

 

可以使用analyze table xx compute statistics來分析表,也可以使用dbms_stats包中的一些方法,通過設定一些引數來具體的分析表。dbms_stats包的一些過程如下:具體可參見oralce官方文件 performance tuning guide.

GATHER_INDEX_STATS

Index statistics

GATHER_TABLE_STATS

Table, column, and index statistics

GATHER_SCHEMA_STATS

Statistics for all objects in a schema

GATHER_DATABASE_STATS

Statistics for all objects in a database

GATHER_SYSTEM_STATS

CPU and I/O statistics for the system

 

gather_table_stats為例:

SQL> begin

  2    dbms_stats.gather_table_stats(ownname => 'TEST', --擁有者使用者名稱

  3                                  tabname => upper('t_test_statistics1'),--表名

  4                                  degree  => 2, --並行度,也可以設定為預設值

  5                                  --DBMS_STATS.AUTO_DEGREE

  6                                  cascade          => true, --是否手機索引統計資訊

  7                                  method_opt       => '',

  8                                  estimate_percent => 100, --是否取樣收集,值為取樣百分比

  9                                  --或者取常量:DBMS_STATS.AUTO_SAMPLE_SIZE0

 10                                  block_sample => true,--採用資料行或者塊取樣,true為塊

 11                                  granularity  => 'AUTO', --分割槽粒度級別,取值為

 12                                  --AUTO ALL GLOBAL PARTITION

 13                                  --SUBPARTITION GLOBAL AND PARTITION10g預設AUTO

 14                                  force => false);

 15  end;

 16 

 17  /

 

PL/SQL procedure successfully completed.

此外還有gather_temp是否收集臨時表統計資訊,gather_sys是否收集sys使用者的統計資訊等

 

或者也可以使用 analyze table 來收集統計資訊:

SQL> analyze table t_test_statistics1 compute statistics;

 

Table analyzed.

 

Oracle 10g預設是設定每天的10點自動收集統計資訊,可以在下面的查詢中看到最近一次job的執行情況:

SQL> select max(to_char(a.log_date, 'yyyy-mm-dd hh24:mi:ss')) datetime,

  2         a.job_name,

  3         a.job_subname,

  4         a.status

  5    from dba_scheduler_job_run_details a

  6   where a.job_name = 'GATHER_STATS_JOB'

  7   group by a.job_name, a.job_subname, a.status;

 

DATETIME            JOB_NAME              JOB_SUBNAME           STATUS

------------------- --------------------- --------------------- ------

2010-07-22 22:00:41 GATHER_STATS_JOB                            SUCCEEDED

 

SQL>

由於作業系統時間問題,這裡看到的07-22其實已經過了,也即已經自動分析了,注意到10g這個自動收集統計資訊可能會給一些在晚間業務繁忙的系統帶來效能隱患,比如一些線上交易的系統,應該選取合適的時間點和時間間隔來做收集。

 

使用dbms_stats.lock_schema_stats來鎖定或解鎖物件統計資訊

同樣以table物件為例子:

鎖定:

SQL> begin

  2    dbms_stats.lock_table_stats(ownname => 'TEST',

  3                                 tabname => upper('t_test_statistics1'));

  4  end;

  5  /

 

PL/SQL procedure successfully completed

 

解鎖:

SQL> begin

  2    dbms_stats.unlock_table_stats(ownname => 'TEST',

  3                                 tabname => upper('t_test_statistics1'));

  4  end;

  5  /

 

PL/SQL procedure successfully completed

 

當然也可以刪除統計資訊,隨後的一些測試可能會用到,不過一般情況下,不會去delete統計資訊。

例如:

SQL> begin

  2    dbms_stats.delete_table_stats(ownname => 'TEST',

  3                                 tabname => upper('t_test_statistics1'));

  4  end;

  5  /

 

PL/SQL procedure successfully completed

 

SQL>

SQL> select a.object_type,

  2         a.num_rows,

  3         a.blocks,

  4         a.empty_blocks,

  5         a.avg_space,

  6         a.chain_cnt,

  7         a.avg_row_len,

  8         a.last_analyzed,

  9         a.stale_stats

 10    from user_tab_statistics a

 11   where a.table_name = upper('t_test_statistics1');

 

OBJECT_TYPE    NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN LAST_ANALYZED STALE_STATS

------------ ---------- ---------- ------------ ---------- ---------- ----------- ------------- -----------

TABLE                                                                                          

 

SQL>

 

 

 

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

相關文章