Oracle sql优化基本概念

本文介绍了数据库统计信息的关键概念,如基数、选择性、直方图和集群因子,及其对SQL查询性能的影响。基数衡量字段取值的多样性,选择性反映字段的离散度,直方图展示数据分布,而集群因子则关乎索引回表的物理I/O。统计信息的准确性对优化器的执行计划至关重要,随着数据变化,静态统计信息可能过时,动态采样提供了一种平衡资源消耗与信息准确性的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基数(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提供了一种补偿机制——动态采样,顾名思义它是动态的实时的,同时因为是对数据块做采样,所以不是完全准确的。采样级别越高,采样的数据块越多,得到的分析数据就越接近于真实,但同时伴随着资源消耗的开销也增加了,这是一个需要权衡考虑的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值