暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DBA性能调优内功心法(十四):天眼篇——开启直方图与动态采样,洞悉数据分布之秘

 

阅读时间: 2025年08月10日
章节: 5.5-5.7 Oracle里的统计信息 (进阶部分)
摘要: 本章节深入到统计信息的核心细节,首先阐述了列统计信息特别是直方图,在解决数据倾斜问题、提升基数估算准确性上的关键作用。接着,本章节讲解了分区表全局统计信息的重要性,并最后介绍了动态采样这一在统计信息缺失时的“应急”机制。掌握这些进阶概念,是DBA从宏观维护转向精细化调优的必经之路。


一、核心概要

本章节的核心,是从“宏观”走向“微观”,探讨了如何为CBO提供更精细、更准确的决策依据。

  • • 列统计信息与直方图:解决了CBO最大的软肋之一——它默认数据是均匀分布的。直方图的出现,让CBO拥有了看清“数据倾斜”的火眼金睛。
  • • 全局统计信息:解决了分区表的“全局视野”问题,让CBO在处理无法进行分区裁剪的查询时,能够基于整张表的特征进行优化。
  • • 动态采样:这是CBO的“后备计划”。当它发现没有统计信息或者现有信息不可信时,它会选择在解析时“临时侦察”一下,以避免做出完全离谱的判断。

二、关键概念重述与实战解读

  1. 1. 列的统计信息
    • • 种类与含义:除了基本的NUM_DISTINCT
      (唯一值数量)、NUM_NULLS
      (空值数量),最重要的就是LOW_VALUE
      HIGH_VALUE
      ,它们定义了列中数据的范围。
    • • 谓词越界实例的警示:本章节的实例深刻说明,如果LOW_VALUE
      HIGH_VALUE
      不准,当WHERE
      条件中的值超出了这个记录的范围时,CBO会估算出极小(通常为1)的基数,这几乎必然会导致其选择错误的执行计划(如嵌套循环)。
    • • 直方图
      • • 含义:直方图是解决数据分布不均问题的关键武器。它告诉CBO,在LOW_VALUE
        HIGH_VALUE
        之间,数据的分布并非一条直线,而是高低起伏的。
      • • 类型:主要有两类,频率直方图(适用于唯一值较少的列),它精确记录了每个值出现的次数;以及高度均衡直方图(适用于唯一值较多的列),它将数据范围切成多个“桶”,保证每个桶里的数据量大致相等。
      • • 对CBO的影响:有了直方图,CBO在估算WHERE col = :b1
        这类查询的成本时,就不再使用简单的公式,而是会去查询直方图,从而得知:b1
        这个值是热门数据还是冷门数据,基数估算的准确性得到质的飞跃。
      • • DBA视角与注意事项:直方图并非万能丹。它会增加统计信息收集的开销和数据字典的存储。我们应有选择性地、仅在那些“数据分布确实倾斜,且该列经常出现在WHERE条件中”的列上创建。通过DBMS_STATS
        包中的METHOD_OPT
        参数,我们可以精确控制直方图的收集策略。
  2. 2. 全局统计信息
    • • 是什么:对于分区表而言,除了每个分区自身的统计信息,还存在一份描述这张表“作为一个整体”的统计信息。
    • • DBA视角:全局统计信息至关重要。当一个查询无法利用分区键进行分区裁剪时(例如,查询条件不含分区键),CBO必须依赖全局统计信息来评估整张表的成本。如果缺失全局统计信息,CBO可能会错误地将所有分区的统计信息简单相加,这在估算NUM_DISTINCT
      等指标时会产生巨大偏差,从而影响执行计划。自11g起,增量收集统计信息(Incremental Statistics)机制大大简化了全局统计信息的维护。
  3. 3. 动态采样
    • • 是什么:在SQL解析阶段,如果CBO发现目标对象没有统计信息,或者它怀疑现有统计信息已严重过时,它可能会触发一个“动态采样”的操作。即在解析时,对目标对象随机读取少量数据块,现场进行一次“迷你”的统计信息收集,并以此为依据来生成执行计划。
    • • DBA视角:动态采样是一把双刃剑。
      • • 优点:它是一个“保险丝”,能有效避免在无统计信息的情况下产生最坏的执行计划,对于数据仓库或临时表等场景尤其有用。
      • • 缺点:它会增加SQL的解析时间。对于要求极低响应时间的OLTP系统,每一次查询都要额外增加采样的开销是不可接受的。
      • • 我们的行动:在OLTP系统中,频繁的动态采样是一个明确的告警信号,它说明我们的常规统计信息收集策略出了问题。我们要做的不应该是粗暴地禁用动态采样(通过OPTIMIZER_DYNAMIC_SAMPLING
        参数),而是应该去找到那些缺失或陈旧统计信息的对象,并为它们建立起可靠的、定期的统计信息收集作业。

 

文章转载自青年数据库学习互助会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论