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%
查询 FAILED 和 SUCCESS 的最佳计划可能不同。直方图能让优化器更准确估算选择性,但也可能增加计划变化,需要结合场景使用。
六、治理计划抖动要先定位原因
遇到 SQL 时快时慢,不要直接加 Hint。先看执行计划是否变化、绑定值是否倾斜、统计信息是否过期、是否发生硬解析。
常见治理手段:
- 重新收集统计信息。
- 为倾斜列收集直方图。
- 使用自适应游标共享。
- 对关键 SQL 使用 SQL Plan Baseline 或 SQL Profile。
- 必要时用 Hint 固定访问路径。
Hint 是工具,但不是第一反应。统计信息和 SQL 形态往往更关键。
七、常见误区与追问
- 误区:绑定变量一定让 SQL 更快。 它减少解析和复用计划,但数据倾斜下可能复用不合适计划。
- 误区:执行计划错一定是优化器太差。 很多时候是统计信息过期或无法反映数据分布。
- 误区:直方图越多越好。 直方图适合倾斜列,滥用会增加维护和计划不稳定。
- 追问:什么是绑定变量窥探? 硬解析时优化器查看首次绑定值,并基于它生成计划。
- 追问:统计信息过期有什么表现? 基数估算严重偏差,导致索引、全表扫描或连接顺序选择错误。
- 追问:SQL Plan Baseline 有什么用? 用于稳定关键 SQL 的执行计划,减少计划漂移风险。
八、面试中可以这样落地
如果一个按地区查询订单的 SQL 时快时慢,可以先查实际执行计划和估算行数差异,再看绑定值分布。如果冷热值差异很大,考虑直方图、自适应游标共享或拆分 SQL。
诊断顺序:
执行计划 -> 估算行数 vs 实际行数 -> 绑定值分布 -> 统计信息时间 -> 治理方案
这样回答体现了排查路径,而不是简单说“加索引”或“加 Hint”。
九、加强记忆
Oracle 优化器题记住“统计信息估基数,基数决定成本,成本决定计划”。绑定变量减少硬解析,但数据倾斜下可能因为绑定变量窥探复用不合适计划。面试时把统计信息、直方图、绑定变量和计划稳定性连起来,就是高级答案。