← 返回题目列表

Oracle 优化器统计信息和绑定变量窥探是什么?

高频 困难 第 20 / 32 题 更新于 2026/07/29
Oracle优化器统计信息绑定变量

简化版

Oracle 优化器依赖统计信息估算基数、选择访问路径和连接方式。统计信息过期会导致执行计划错误;绑定变量能减少硬解析,但绑定变量窥探可能让优化器根据第一次绑定值生成计划,后续不同分布的值复用同一计划时出现性能抖动。

详细版

优化器统计信息包括表行数、列基数、直方图、索引统计、分区统计等。它们帮助优化器估算过滤条件会返回多少行。

绑定变量的好处:

  • 减少硬解析。
  • 提高 Shared Pool 复用。
  • 降低 SQL 注入风险。

绑定变量的风险:

  • 数据倾斜时,不同值适合不同计划。
  • 绑定变量窥探可能让第一次值影响计划。
  • 需要通过直方图、自适应游标共享、SQL Profile、Hint 或改写 SQL 治理。

面试重点是:绑定变量通常是好事,但在数据倾斜场景要关注执行计划稳定性。

完整版教学

一、优化器为什么需要统计信息

SQL 优化器选择执行计划时,需要估算每一步会处理多少数据。它不可能真的先把所有候选计划跑一遍,所以要依赖统计信息。

比如 where status = 'PAID',如果优化器知道 PAID 占 90%,可能选择全表扫描;如果只占 1%,可能选择索引扫描。

估算返回 1% -> 倾向索引
估算返回 90% -> 倾向全表扫描

记忆钩子:执行计划不是猜出来的,是优化器拿统计信息估算成本后选出来的。

二、统计信息包含哪些内容

统计信息不只是表行数。它还包括列的不同值数量、空值数量、数据分布、索引高度、聚簇因子、分区统计等。

统计项影响
表行数估算扫描规模
列基数判断过滤选择性
直方图识别数据倾斜
索引统计判断索引访问成本
分区统计分区裁剪和局部估算

如果统计信息过期,优化器可能以为表只有 10 万行,实际已经 1 亿行,计划自然容易错。

三、绑定变量减少硬解析

不使用绑定变量时,应用可能生成大量只有字面量不同的 SQL。

select * from orders where id = 1;
select * from orders where id = 2;

使用绑定变量后,SQL 结构相同:

select * from orders where id = :id;

这样更容易复用解析结果和执行计划,降低 Shared Pool 压力。OLTP 系统通常强烈推荐绑定变量。

四、绑定变量窥探为什么会带来计划问题

绑定变量窥探是指优化器在硬解析时查看第一次绑定变量的实际值,并据此估算计划。问题出现在数据倾斜场景。

比如 region 字段里,BEIJING 有 900 万行,LHASA 有 1 万行。第一次执行传 LHASA,优化器选择索引;后续传 BEIJING 仍复用索引计划,就可能很慢。

首次绑定 LHASA -> 索引计划
后续绑定 BEIJING -> 复用索引计划 -> 回表大量数据

这不是绑定变量本身错,而是同一个 SQL 对不同值需要不同计划。

五、直方图用于描述数据倾斜

如果列值分布均匀,基数统计就足够;如果分布严重倾斜,直方图能帮助优化器识别热门值和冷门值差异。

例如状态列:

SUCCESS: 95%
FAILED:  4%
PENDING: 1%

查询 FAILEDSUCCESS 的最佳计划可能不同。直方图能让优化器更准确估算选择性,但也可能增加计划变化,需要结合场景使用。

六、治理计划抖动要先定位原因

遇到 SQL 时快时慢,不要直接加 Hint。先看执行计划是否变化、绑定值是否倾斜、统计信息是否过期、是否发生硬解析。

常见治理手段:

  • 重新收集统计信息。
  • 为倾斜列收集直方图。
  • 使用自适应游标共享。
  • 对关键 SQL 使用 SQL Plan Baseline 或 SQL Profile。
  • 必要时用 Hint 固定访问路径。

Hint 是工具,但不是第一反应。统计信息和 SQL 形态往往更关键。

七、常见误区与追问

  • 误区:绑定变量一定让 SQL 更快。 它减少解析和复用计划,但数据倾斜下可能复用不合适计划。
  • 误区:执行计划错一定是优化器太差。 很多时候是统计信息过期或无法反映数据分布。
  • 误区:直方图越多越好。 直方图适合倾斜列,滥用会增加维护和计划不稳定。
  • 追问:什么是绑定变量窥探? 硬解析时优化器查看首次绑定值,并基于它生成计划。
  • 追问:统计信息过期有什么表现? 基数估算严重偏差,导致索引、全表扫描或连接顺序选择错误。
  • 追问:SQL Plan Baseline 有什么用? 用于稳定关键 SQL 的执行计划,减少计划漂移风险。

八、面试中可以这样落地

如果一个按地区查询订单的 SQL 时快时慢,可以先查实际执行计划和估算行数差异,再看绑定值分布。如果冷热值差异很大,考虑直方图、自适应游标共享或拆分 SQL。

诊断顺序:
执行计划 -> 估算行数 vs 实际行数 -> 绑定值分布 -> 统计信息时间 -> 治理方案

这样回答体现了排查路径,而不是简单说“加索引”或“加 Hint”。

九、加强记忆

Oracle 优化器题记住“统计信息估基数,基数决定成本,成本决定计划”。绑定变量减少硬解析,但数据倾斜下可能因为绑定变量窥探复用不合适计划。面试时把统计信息、直方图、绑定变量和计划稳定性连起来,就是高级答案。