程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> PLSQL_性能優化系列1_統計信息的概念和重要性(概念),plsql性能優化

PLSQL_性能優化系列1_統計信息的概念和重要性(概念),plsql性能優化

編輯:Oracle教程

PLSQL_性能優化系列1_統計信息的概念和重要性(概念),plsql性能優化


2014-12-18 Created By BaoXinjian

一、摘要


Statistic 對Oracle 是非常重要的。

它會收集數據庫中對象的詳細信息,並存儲在相應的數據字典裡。 根據這些統計信息, optimizer 可以對每個SQL 去選擇最好的執行計劃。

Statistic 對Oracle 是非常重要的,它會收集數據庫中對象的詳細信息,並存儲在相應的數據字典裡。

根據這些統計信息, optimizer 可以對每個SQL 去選擇最好的執行計劃。

Oracle Statistic 的收集,可以使用analyze 命令,也可以使用DBMS_STATS 包來收集。

Oracle 建議使用DBMS_STATS包來收集統計信息,因為DBMS_STATS包收集的更廣,並且更准確,Analyze 在以後的版本中可能會被移除。

 

二、統計信息內容和層次


1. Table statistics

(1). 行數,塊數,行平均長度

(2). DBA_TBALES:NUM_ROWS,BLOCKS,AVG_ROW_LEN;

  • Number of rows
  • Number of blocks
  • Average row length

2. Column statistics

(1). 列中唯一值的數量(NDV),NULL值的數量,數據分布;

(2). DBA_TAB_COLUMNS:NUM_DISTINCT,NUM_NULLS,HISTOGRAM;

  • Number of distinct values (NDV) in column
  • Number of nulls in column
  • Data distribution (histogram)

3. Index statistics

(1). 葉塊數量,等級,聚簇因子;

(2). DBA_INDEXES:LEAF_BLOCKS,CLUSTERING_FACTOR,BLEVEL;

  • Number of leaf blocks
  • Levels
  • Clustering factor

4. System statistics

(1). 存儲在aux_stats$中,需要使用dbms_stats收集,I/O統計在X$KCFIO中;

  • I/O performance and utilization
  • CPU performance and utilization

 

三、統計信息語法


1. analyze

需要使用ANALYZE統計的統計:使用LIST CHAINED ROWS和VALIDATE子句收集空閒列表塊的統計;

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]

2. dbms_stats

dbms_stats能良好地估計統計數據(尤其是針對較大的分區表),並能獲得更好的統計結果,最終制定出速度更快的SQL執行計劃。

這個包的下面四個存儲過程分別收集index、table、schema、database的統計信息:

  • dbms_stats.gather_table_stats     收集表、列和索引的統計信息;
  • dbms_stats.gather_schema_stats    收集SCHEMA下所有對象的統計信息;
  • dbms_stats.gather_index_stats     收集索引的統計信息;
  • dbms_stats.gather_system_stats    收集系統統計信息
  • dbms_stats.gather_dictioinary_stats   所有字典對象的統計;
  • dbms_stats.delete_table_stats     刪除表的統計信息
  • dbms_stats.delete_index_stats     刪除索引的統計信息
  • dbms_stats.export_table_stats     輸出表的統計信息
  • dbms_stats.create_state_table
  • dbms_stats.set_table_stats     設置表的統計
  • dbms_stats.auto_sample_size

 

四、統計信息語法


4.1 統計信息收集如下數據:

(1)表自身的分析: 包括表中的行數,數據塊數,行長等信息。

(2)列的分析:包括列值的重復數,列上的空值,數據在列上的分布情況。

(3)索引的分析: 包括索引葉塊的數量,索引的深度,索引的聚合因子等。

4.2 這些統計信息存放在數據字典裡,如:

(1).  DBA_TABLES

(2).  DBA_OBJECT_TABLES

(3).  DBA_TAB_STATISTICS

(4).  DBA_TAB_COL_STATISTICS

(5).  DBA_TAB_HISTOGRAMS

(6).  DBA_INDEXES

(7).  DBA_IND_STATISTICS

(8).  DBA_CLUSTERS

(9).  DBA_TAB_PARTITIONS

(10). DBA_TAB_SUBPARTITIONS

(11). DBA_IND_PARTITIONS

(12). DBA_IND_SUBPARTITIONS

(13). DBA_PART_COL_STATISTICS

(14). DBA_PART_HISTOGRAMS

(15). DBA_SUBPART_COL_STATISTICS

(16). DBA_SUBPART_HISTOGRAMS

4.3 表的統計信息:

包含表行數,使用的塊數,空的塊數,塊的使用率,行遷移和鏈接的數量,pctfree,pctused的數據,行的平均大小:

SELECT NUM_ROWS, --表中的記錄數
        BLOCKS, --表中數據所占的數據塊數
        EMPTY_BLOCKS, --表中的空塊數
        AVG_SPACE, --數據塊中平均的使用空間
        CHAIN_CNT, --表中行連接和行遷移的數量
        AVG_ROW_LEN --每條記錄的平均長度
FROM USER_TABLES 

4.4 索引列的統計信息   

包含索引的深度(B-Tree的級別),索引葉級的塊數量,集群因子(clustering_factor), 唯一值的個數。

SELECT BLEVEL, --索引的層數
    LEAF_BLOCKS, --葉子結點的個數
    DISTINCT_KEYS, --唯一值的個數
    AVG_LEAF_BLOCKS_PER_KEY, --每個KEY的平均葉塊個數
    AVG_DATA_BLOCKS_PER_KEY, --每個KEY的平均數據塊個數
    CLUSTERING_FACTOR --群集因子
FROM USER_INDEXES

4.5 列的統計信息  

包含 唯一的值個數,列最大小值,密度(選擇率),數據分布(直方圖信息),NUll值個數

SELECT NUM_DISTINCT, --唯一值的個數
    LOW_VALUE, --列上的最小值
    HIGH_VALUE, --列上的最大值
    DENSITY, --選擇率因子(密度)
    NUM_NULLS, --空值的個數
    NUM_BUCKETS, --直方圖的BUCKET個數
    HISTOGRAM --直方圖的類型
FROM USER_TAB_COLUMNS

 

五、案例


案例: 查詢表時,解析計劃返回結果集Rows完全不正確,表通過大量的DML後,未進行分析導致統計信息過久

Step1. 建立測試SQL

Step2. 查看結果集的Cardinality

Step3. 查看表的統計計劃,最後分析時間過久

Step4. 分析表

BEGIN
   DBMS_STATS.gather_table_stats ('SH', 'SALES');
END;

Step5. 分析表後統計信息變更為最新

Step6. 解析計劃Cardinality變更更為准確

 

Thanks and Regards

參考: 一江水 - http://www.cnblogs.com/rootq/archive/2010/02/04/1663622.html

參考: David - http://blog.csdn.net/tianlesoftware/article/details/4668723

參考: Edwardking888 - http://blog.itpub.net/8183550/viewspace-666335/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved