PLSQL_性能优化系列1_统计信息的概念和重要性(概念)

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/

时间: 2024-10-09 14:52:47

PLSQL_性能优化系列1_统计信息的概念和重要性(概念)的相关文章

PLSQL_性能优化系列16_Oracle DataScan数据扫描

对数据的读取操作是非常消耗资源的,如何减少对数据的扫描,是提升sql效率的一个重要方面,例如物化视图技术.本篇介绍几种sql写法,分别是CASE expression/DML with returning clause /multitable insert.[@[email protected]] 一. 用CASE EXPRESSION将多句查询组合在一起SELECT COUNT (*)FROM employeesWHERE salary < 2000;SELECT COUNT (*)FROM

PLSQL_性能优化系列15_Oracle Statistics统计信息

2014-12-18 BaoXinjian 一.摘要 Statistic 对Oracle 是非常重要的. 它会收集数据库中对象的详细信息,并存储在相应的数据字典里. 根据这些统计信息, optimizer 可以对每个SQL 去选择最好的执行计划. Statistic 对Oracle 是非常重要的,它会收集数据库中对象的详细信息,并存储在相应的数据字典里. 根据这些统计信息, optimizer 可以对每个SQL 去选择最好的执行计划. Oracle Statistic 的收集,可以使用analy

PLSQL_性能优化系列04_Oracle Optimizer优化器

2014-09-25 BaoXinjian 一.摘要 1. Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. 2. RBO优化器 RBO是一种基于规则的优化器,随着CBO优化器的逐步发展和完善,在最新的10g版本中Oracle已经彻底废除了RBO. 正在使用Oracle8i或9i的人们或多或少的都会碰到RBO,因此在详细介绍CBO之前,我们有必要简单回顾一下古

PLSQL_性能优化系列01_Oracle Index索引

2014-06-01 BaoXinjian 一.摘要 在PLSQL查询优化中,使用和接触最多的应该是索引Index这个概念,个人也觉得对Index选择和优化是程式优化过程中比较重要的概念,特别是刚开始接触PLSQL性能优化 索引的一些概念 一个索引可以由一个或多个列组成, 对列设置索引其实就是对列的内容按一定的方式进行排序,检索数据的时候,检索排过序的数据,检索到最后一个有效数据之后就跳出检索 这样就不必进行全表扫描了,同时可以应用很多算法提高检索效率 数据库多用二分法检索数据 索引的连接方式

PLSQL_性能优化系列05_Oracle Hint提示

2014-06-20 BaoXinjian 一.摘要 手工指定SQL语句的执行计划 尽管oracle优化器很智能,但有时候你想自己选择执行计划,可以通过hint实现.在开发测试环境中,可以通过hint测试不同执行计划的性能. Hint的缺点是增加了管理代码的额外负担,当数据库或环境发生变化时,如果不修改hint,可能导致性能下降.例如,代码中用hint指定索引,但重建索引时索引名变化. 因此oracle建议使用hint测试性能后,用其他工具来管理执行计划,如oracle 10g以后的sql tu

PLSQL_性能优化系列14_Oracle Index Anaylsis索引分析

2014-10-04 BaoXinjian 一.摘要 1. 索引质量 索引质量的高低对数据库整体性能有着直接的影响. 良好高质量的索引使得数据库性能得以数量级别的提升,而低效冗余的索引则使得数据库性能缓慢如牛,即便是使用高档的硬件配置. 因此对于索引在设计之初需要经过反复的测试与考量. 那对于已经置于生产环境中的数据库,我们也可以通过查询相关数据字典得到索引的质量的高低,通过这个分析来指导如何改善索引的性能. 2. 索引创建的基本指导原则 索引的创建应遵循精而少的原则 收集表上所有查询的各种不同

PLSQL_性能优化系列16_Oracle High Water Level高水位分析

2014-10-04 BaoXinjian 一.摘要 高水位线好比水库中储水的水位线,用于描述数据库中段的扩展方式.高水位线对全表扫描方式有着至关重要的影响. 当使用delete 操作表记录时,高水位线并不会下降,随之导致的是全表扫描的实际开销并没有任何减少. 本文给出高水位线的描述,如何降低高水位线,以及高水位线对全表扫描的影响. 1. 何谓高水位线 如前所述,类似于水库中储水的水位线.只不过在数据库中用于描述段的扩展方式. 可以将数据段或索引段等想象为一个从左到右依次排开的一系列块.当这些块

PLSQL_性能优化系列14_Oracle High Water Level高水位分析

2014-10-04 BaoXinjian 一.摘要 高水位线好比水库中储水的水位线,用于描述数据库中段的扩展方式.高水位线对全表扫描方式有着至关重要的影响. 当使用delete 操作表记录时,高水位线并不会下降,随之导致的是全表扫描的实际开销并没有任何减少. 本文给出高水位线的描述,如何降低高水位线,以及高水位线对全表扫描的影响. 1. 何谓高水位线 如前所述,类似于水库中储水的水位线.只不过在数据库中用于描述段的扩展方式. 可以将数据段或索引段等想象为一个从左到右依次排开的一系列块.当这些块

PLSQL_性能优化系列06_Oracle Soft Parse / Hard Parse软硬解析

2014-08-11 BaoXinjian 一.摘要 Oracle硬解析和软解析是我们经常遇到的问题,所以需要考虑何时产生软解析何时产生硬解析,如何判断 1. SQL的执行过程 当发布一条SQL或PL/SQL命令时,Oracle会自动寻找该命令是否存在于共享池中来决定对当前的语句使用硬解析或软解析. 通常情况下,SQL语句的执行过程如下: Step1. SQL代码的语法(语法的正确性)及语义检查(对象的存在性与权限). Step2. 将SQL代码的文本进行哈希得到哈希值. Step3. 如果共享