当前位置:首页 > 问答 > 正文

DB2优化器|执行计划更新 DB2数据库优化器刷新执行计划实战经验超精华版

DB2优化器|执行计划更新:DB2数据库优化器刷新执行计划实战经验超精华版

最新动态(2025年7月)
近期IBM发布了DB2 12.0.5版本补丁包,针对优化器统计信息收集逻辑进行了重要改进,根据官方技术文档显示,新版本在混合负载场景下的执行计划稳定性提升了23%,这对长期受执行计划突变困扰的DBA团队来说是个重大利好。

为什么你的DB2突然变慢了?

上周老王就遇到这么个事儿:
"见鬼了!同样的查询昨天跑0.8秒,今天突然要12秒!"——这是典型的执行计划劣化症状,DB2优化器就像个老会计,它依赖的"账本"(统计信息)要是过时了,算出来的执行计划(查询路线图)就可能跑偏。

执行计划更新的三大黄金时刻

  1. 数据量突变后
    当单表数据量增长超过20%(比如从100万跳到150万),就该立即更新统计信息,我见过有个电商系统,大促后订单表暴涨30万条,没更新统计信息导致库存查询超时,差点酿成事故。

  2. 索引调整后
    新增/删除索引后一定要做这件事:

    RUNSTATS ON TABLE 销售.订单 WITH DISTRIBUTION AND DETAILED INDEXES ALL

    去年某银行系统加了组合索引却没更新统计,结果优化器死活不用新索引,DBA团队排查了整整两天。

  3. DB2升级后
    特别是大版本升级(比如11.5升12.0),优化器算法可能有重大调整,建议升级后对所有关键表执行:

    REBIND PACKAGE COLLECTION NULLID

实战中的五个血泪教训

案例1:凌晨跑批突然超时
某物流系统每日3点跑批,某天突然超时2小时,最后发现是统计信息自动收集任务被误关闭,导致优化器还在用三个月前的数据分布信息。

DB2优化器|执行计划更新 DB2数据库优化器刷新执行计划实战经验超精华版

解决方案

-- 检查自动统计收集状态
SELECT NAME, VALUE FROM SYSIBMADM.DBMCFG WHERE NAME LIKE 'auto_runstats%'
-- 手动紧急更新(加采样加速)
RUNSTATS ON TABLE 物流.运单 TABLESAMPLE SYSTEM(10) 

案例2:参数嗅探的坑
某医保系统遇到更诡异的情况:同样的SQL,不同账号执行速度差10倍!原来是优化器"了第一次执行时的参数值(查询特定病种),后续查询其他病种时仍沿用旧计划。

破解方法

-- 在问题SQL前添加特殊注释
SELECT /* REOPT ONCE */ 诊疗项目 FROM 医保记录 WHERE 病种=?

高阶玩家必备技巧

  1. 统计信息保鲜术
    对核心交易表采用差异化策略:

    -- 基础表每天全量收集
    RUNSTATS ON TABLE 交易.订单 WITH DISTRIBUTION AND SAMPLED DETAILED
    -- 历史表每周抽样收集
    RUNSTATS ON TABLE 交易.订单_历史 TABLESAMPLE BERNOULLI(5)
  2. 执行计划强制校正
    当优化器死活不听话时,祭出终极武器:

    -- 先获取问题SQL的语句哈希
    SELECT STMT_HASH FROM TABLE(MON_GET_PKG_CACHE_STMT(NULL,NULL,NULL,-2))
    -- 然后强制指定索引
    CALL SYSPROC.SET_ROUTINE_OPTIONS('SQL240710123456','USE INDEX IX_订单_日期')
  3. 监控清单这样建
    在我的运维仪表盘上永远开着这几个监控项:

    • 统计信息最后更新时间
    • 执行计划突变次数
    • 排序溢出百分比

避坑指南

  1. 不要迷信AUTO_RUNSTATS
    自动收集可能跳过"不太活跃"的表,某证券系统就因此栽过跟头——半年没更新的客户资料表直接拖垮季度报表。

  2. 谨慎使用WITH DISTRIBUTION
    虽然它能收集列值分布信息,但对超大型表可能引发锁等待,有次我们对20亿条记录的表收集分布信息,直接导致应用连接池爆满。

    DB2优化器|执行计划更新 DB2数据库优化器刷新执行计划实战经验超精华版

  3. REORG和RUNSTATS的舞步
    正确的顺序应该是:

    数据加载 → REORG → RUNSTATS → REBIND

    见过有人反着来,结果统计信息反映的是重组前的数据分布,全乱套了。

终极验证大法

每次更新统计信息后,务必做这三件事:

  1. 用EXPLAIN检查关键查询计划
  2. 对比更新前后的执行时间
  3. 检查DB2DIAG日志有无警告

记住这个真理:优化器再聪明,也敌不过过时的情报,就像用去年的地图找新开的餐馆,能不绕路吗?

(完)

本文基于2025年7月发布的DB2 12.0.5技术手册及笔者在金融、物流行业的实战案例整理,具体操作请根据实际环境调整,关键操作建议在测试环境验证后实施。

发表评论