Oracle sql优化基本概念

基数(Cardinality)

  • 定义:相对于一个字段而言,所有取值范围的数量
  • 脚本:SELECT COUNT(DISTINCT JOB) FROM EMP;
  • 说明:单看基数,没有意义

选择性(selectivity)

  • 定义:相对于一个字段而言,基数/总行数*100%
  • 脚本:
    • 人工计算:根据定义,人工编写脚本计算
    • 统计表:借助DBA_TAB_COL_STATISTICS、DBA_TABLES,这种方式需要先收集统计信息
  • 说明:选择性实际上反应的是字段的离散度,选择性越大离散度越高,字段的值分布均衡概率越大

直方图(histogram)

  • 定义:相对于一个字段而言,实际上是字段值的具体分布
  • 脚本:相当于select job,count(*) from emp group by job;
  • 说明:优化器默认字段的数据分布是均衡的,但实际上选择性低的字段的数据分布往往是不均衡的,默认规则与现实的差异会导致优化器选择错误的执行计划

回表(table access by index rowid)

  • 定义:通过索引本身无法获取全部数据,需要再借助rowid访问表中的数据。执行计划中的标识为:table access by index rowid
  • 说明:回表一般是单块读,回表次数太多会严重影响sql性能

集群因子(clustering factor)

  • 定义:通过一个索引扫描一张表,需要访问的表的数据块的数量。用于判断索引回表的物理I/O次数,其值介于表块数和行数之间
  • 脚本:SELECT OWNER, INDEX_NAME, CLUSTERING_FACTOR FROM DBA_INDEXES WHERE OWNER = 'SCOTT' AND INDEX_NAME = 'IDX_JOB';
  • 说明:
    • 值越接近块数,说明表的数据基本是有序的,并且其顺序与索引顺序基本一致;值越接近行数,说明表的数据和索引顺序差异很大。
    • 当索引范围扫描、索引全扫描不回表或返回数据量很少的时候,不管集群因子多大,对于sql查询性能几乎没有影响。索引唯一扫描只返回一条数据不受影响、索引快速全扫描不回表更不受影响

表之间关系

  • 定义:主要指表之间的数量关系,一对一、一对多等

思考

  • 基数、直方图等,都属于统计信息,统计信息有很多,比如:
    • 表的统计信息:总行数、块数、行平均长度,DBA_TABLES
    • 列的统计信息:基数、空值数量、数据分布(直方图),DBA_TAB_COL_STATISTICS
    • 索引的统计信息:blevel、叶子块个数、集群因子,DBA_INDEXES

它们有一个共同点,都是静态的统计信息,随着时间推移当表中数据发生变化时,统计信息其实已经过时、不准确了。对于这种情况,oracle提供了一种补偿机制——动态采样,顾名思义它是动态的实时的,同时因为是对数据块做采样,所以不是完全准确的。采样级别越高,采样的数据块越多,得到的分析数据就越接近于真实,但同时伴随着资源消耗的开销也增加了,这是一个需要权衡考虑的东西。

猜你喜欢

转载自blog.csdn.net/csdnklsdm/article/details/118691545