阅读时间: 2025年08月10日
章节: 5.5-5.7 Oracle里的统计信息 (进阶部分)
摘要: 本章节深入到统计信息的核心细节,首先阐述了列统计信息特别是直方图,在解决数据倾斜问题、提升基数估算准确性上的关键作用。接着,本章节讲解了分区表全局统计信息的重要性,并最后介绍了动态采样这一在统计信息缺失时的“应急”机制。掌握这些进阶概念,是DBA从宏观维护转向精细化调优的必经之路。
一、核心概要
本章节的核心,是从“宏观”走向“微观”,探讨了如何为CBO提供更精细、更准确的决策依据。
• 列统计信息与直方图:解决了CBO最大的软肋之一——它默认数据是均匀分布的。直方图的出现,让CBO拥有了看清“数据倾斜”的火眼金睛。 • 全局统计信息:解决了分区表的“全局视野”问题,让CBO在处理无法进行分区裁剪的查询时,能够基于整张表的特征进行优化。 • 动态采样:这是CBO的“后备计划”。当它发现没有统计信息或者现有信息不可信时,它会选择在解析时“临时侦察”一下,以避免做出完全离谱的判断。
二、关键概念重述与实战解读
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. 全局统计信息 • 是什么:对于分区表而言,除了每个分区自身的统计信息,还存在一份描述这张表“作为一个整体”的统计信息。 • DBA视角:全局统计信息至关重要。当一个查询无法利用分区键进行分区裁剪时(例如,查询条件不含分区键),CBO必须依赖全局统计信息来评估整张表的成本。如果缺失全局统计信息,CBO可能会错误地将所有分区的统计信息简单相加,这在估算 NUM_DISTINCT
等指标时会产生巨大偏差,从而影响执行计划。自11g起,增量收集统计信息(Incremental Statistics)机制大大简化了全局统计信息的维护。3. 动态采样 • 是什么:在SQL解析阶段,如果CBO发现目标对象没有统计信息,或者它怀疑现有统计信息已严重过时,它可能会触发一个“动态采样”的操作。即在解析时,对目标对象随机读取少量数据块,现场进行一次“迷你”的统计信息收集,并以此为依据来生成执行计划。 • DBA视角:动态采样是一把双刃剑。 • 优点:它是一个“保险丝”,能有效避免在无统计信息的情况下产生最坏的执行计划,对于数据仓库或临时表等场景尤其有用。 • 缺点:它会增加SQL的解析时间。对于要求极低响应时间的OLTP系统,每一次查询都要额外增加采样的开销是不可接受的。 • 我们的行动:在OLTP系统中,频繁的动态采样是一个明确的告警信号,它说明我们的常规统计信息收集策略出了问题。我们要做的不应该是粗暴地禁用动态采样(通过 OPTIMIZER_DYNAMIC_SAMPLING
参数),而是应该去找到那些缺失或陈旧统计信息的对象,并为它们建立起可靠的、定期的统计信息收集作业。
文章转载自青年数据库学习互助会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




