DB2优化器在生成访问计划时,会基于统计信息和成本模型做出一系列决策,比如选择全表扫描还是索引扫描、采用哪种连接顺序等。但默认情况下,用db2expln或EXPLAIN快照看到的输出信息往往只包含最终选定计划的概要,许多中间推导过程被隐藏了。如果想直观了解优化器为什么放弃某个索引、为什么估算的行数偏差较大,就需要借助opt_enable_partial_report这个注册表变量来开启部分报表功能。

opt_enable_partial_report对应的完整变量名是DB2_OPT_ENABLE_PARTIAL_REPORT。当其被设置为ON或TRUE后,DB2优化器就会在生成执行计划的同时,产生一份详细的内部估算报表,并将内容附着在计划的详细信息中。这份报表不会改变实际SQL的执行路径,也不会额外增加运行时开销,所有开支都只在编译阶段发生。因此对于需要反复分析的查询,开启该功能不会影响生产系统的性能稳定性。
参数设置方法与作用域
该变量属于DB2注册表变量,需要通过db2set命令进行设置。设置可以针对实例级别,也可以针对特定数据库分区或全局范围。典型的启用命令为:db2set DB2_OPT_ENABLE_PARTIAL_REPORT=ON,设置完成后需要重启实例使变量生效。如果只想在当前会话中临时启用,可以通过设置专用注册表变量并结合DB2OPTIONS环境变量来实现,但生产环境的永久诊断通常建议采用实例级方式。
启用后,优化器会在db2exfmt输出的详细计划中增加一个名为“Partial Report”的段落。需要用db2exfmt工具并指定-1选项来提取完整计划信息。你会发现每个操作符后面都会附带谓词选择率、组合选择率、索引搜索条件拆解、TTL(Time To Live)中间结果行数预估等数据,这些原本沉睡在优化器内部的估算值,一下子变得清晰可见。
核心输出内容解读
部分报表中最关键的几个指标包括:每个谓词的选择率、剩余谓词的过滤因子、连接基数的独立估算、以及索引匹配后仍需扫描的页数预估。例如,对于一条带复合过滤条件的查询,你可以看到优化器对列A的过滤因子评估为0.4,对列B的评估为0.02,组合选择率如何相乘得到0.008,因而推算出中间结果集仅为总行数的0.8%。如果这个推算与你的业务直觉不符,就说明统计信息或分布假设出了偏差。
此外,报表还会展示索引扫描时的起始和停止条件,以及扫描区间内的预期键值数目。通过对比这些信息与实际数据倾斜情况,DBA能够快速识别出“索引看上去被使用,但效率低下”的真正原因,比如扫描了大量无效键值,或者因为匹配列基数过低导致大量随机I/O。
| 报表项 | 含义 |
|---|---|
| Predicate Selectivity | 单个谓词的过滤因子 |
| Combined Selectivity | 多个谓词组合后的总过滤因子 |
| Index Sargable Predicates | 可被索引匹配的谓词列表 |
| Estimated Key Cardinality | 索引扫描预估处理的键值数量 |
| Residual Predicate | 索引无法过滤、需回表后再判断的条件 |
典型应用场景
场景一:排查执行计划突变。当一条SQL在统计信息更新后突然从索引扫描变为全表扫描时,通过部分报表可以知道是新统计信息导致索引选择率估算过高,还是数据倾斜让优化器认为索引收益下降。对比变更前后的谓词选择率数据,往往能直接锁定问题根源。
场景二:验证索引设计合理性。新建组合索引后,期望过滤效果达到90%以上,但实际执行时发现仍有大量回表操作。部分报表会告诉你索引匹配后剩余的谓词是什么、剩余过滤因子多大,从而判断是否需要调整索引列顺序或增加覆盖列。
场景三:优化器估算与运行时行数差异分析。借助部分报表中的估计行数,与实际执行后的记录数做对比,可以发现哪些操作符的估算失准,进而决定是采取分布统计信息、列组统计信息还是使用统计视图来修正。
使用注意事项
虽然opt_enable_partial_report不会增加SQL执行成本,但编译期间的额外估算步骤会轻微增加查询的编译时间。对于编译时间本就很长的复杂查询,建议先在测试环境开启分析,避免在高峰时段频繁执行db2exfmt提取计划。另外,部分报表的输出格式可能因DB2版本而略有差异,建议使用与生产环境相同版本的db2exfmt工具进行提取,以保证信息完整。
在某些环境下,DB2_OPT_ENABLE_PARTIAL_REPORT变量的值对优化器语义没有任何影响,需要确认数据库版本支持该变量。该功能从DB2 10.1起逐步完善,越新的版本输出的报表细节越丰富。如果发现设置后无反应,请检查实例是否已重启,以及是否使用了正确的db2exfmt参数。
DB2opt_enable_partial_reportpartial_report修改时间:2026-08-12 04:13:19