Oracle 中,哪种操作会导致查询执行计划的重计算?
A
修改统计信息或表结构
B
使用 HINTS
C
使用 JOIN
D
使用 EXPLAIN PLAN
在Oracle数据库中,查询执行计划的重计算(即优化器重新生成执行计划)主要由以下操作触发:
正确答案:A(修改统计信息或表结构)
1. 修改统计信息
• 统计信息的作用:Oracle优化器(CBO)依赖表、列、索引的统计信息(如行数、数据分布、索引高度等)计算执行计划的成本(Cost)。若统计信息更新,优化器会根据新数据重新评估执行路径。
• 示例:若表中某列的最大值统计不准确(如日期字段的最大值未更新),可能导致优化器错误选择全表扫描而非索引扫描。通过手动更新统计信息(如调用DBMS_STATS.GATHER_TABLE_STATS),可强制优化器重新生成正确的执行计划。
• 影响场景:数据量剧烈变化(如大批量插入或删除)、索引重建后未收集统计信息等。
2. 修改表结构
• DDL操作的影响:修改表结构(如ALTER TABLE添加/删除列、调整列类型、分区操作等)会触发统计信息失效,进而导致优化器重计算执行计划。
• 示例:添加新列后,若未及时更新统计信息,优化器可能低估查询的数据量,选择低效的全表扫描。
• 锁与性能:某些DDL操作(如修改列长度)可能锁定表,影响并发性能,并伴随索引重建等系统开销。
其他选项解析
B. 使用HINTS
• HINTS的作用:通过/*+ HINT */语法强制指定执行计划(如USE_NL、INDEX),目的是避免优化器重计算,直接固定执行路径。
• 示例:SELECT /*+ INDEX(emp idx_emp_id) */ * FROM emp会强制使用索引idx_emp_id。
• 适用场景:优化器因统计信息不准确或复杂查询逻辑生成次优计划时,人工干预优化。
C. 使用JOIN
• JOIN本身不触发重计算:JOIN操作(如嵌套循环、哈希连接)是优化器基于统计信息和成本模型自动选择的连接方式,仅当表结构或统计信息变化时,JOIN策略可能调整。
• 示例:若关联表的统计信息更新,优化器可能从嵌套循环切换为哈希连接。
D. 使用EXPLAIN PLAN
• 仅生成执行计划:EXPLAIN PLAN命令用于查看SQL的预期执行路径,不会实际执行查询或触发重计算。
• 工具特性:通过DBMS_XPLAN.DISPLAY或SQL Developer可视化工具查看计划,不影响优化器决策。
总结
| 操作类型 | 是否触发重计算 | 原因说明 |
|---|---|---|
| 修改统计信息或表结构 (A) | ✅ 是 | 统计信息或表结构变化直接影响优化器成本模型,需重新评估执行路径 |
| 使用HINTS (B) | ❌ 否 | 强制固定执行路径,绕过优化器重计算 |
| 使用JOIN (C) | ❌ 否 | 优化器自动选择连接方式,仅依赖统计信息是否变更 |
| 使用EXPLAIN PLAN (D) | ❌ 否 | 仅用于查看执行计划,不实际执行或影响优化器 |
实际建议:
• 定期收集统计信息(如使用DBMS_STATS),避免因数据变化导致执行计划劣化。
• 谨慎执行DDL操作,尽量在业务低峰期进行,并监控执行计划变化。




