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

DB2里头SQL执行计划咋监控和简单了解一下吧

要搞清楚DB2里头SQL执行计划是咋回事,首先得明白它是个啥,简单打个比方,你要从北京去上海,可以坐高铁、飞机、自驾或者绿皮车,数据库处理一条SQL语句,帮我找一下上个月所有买了手机并且是VIP的客户”,它也面临着类似的选择:是先从上亿条订单里把买手机的找出来,再去VIP表里核对呢?还是先把所有VIP客户找出来,再看他们谁买了手机?或者是把两个表先合并一下再筛选?这个“选择怎么走”的方案,就是执行计划,一个好的计划能秒出结果,一个烂的计划可能让你等到天黑。

监控和了解执行计划的核心目的,就是为了发现那些“烂计划”,并想办法把它变好,让SQL跑得快起来。

怎么看到这个执行计划?

在DB2里,最常用、最直接的工具就是db2exfmt,你不用记太多复杂命令,就记住这个工具能给你生成一个非常详细、容易阅读的报告,具体怎么做呢?

  1. 先让DB2记录下可疑的SQL:当某个SQL跑得特别慢的时候,你需要先捕获它,可以设置一个监控开关(官方叫“事件监控器”),专门针对执行时间长的SQL,你可以告诉DB2:“帮我盯着点,凡是执行超过5秒的SQL,都把它的详细信息(包括它的执行计划蓝图)记下来。”这个设置过程可能需要一些DB2的命令,CREATE EVENT MONITOR FOR STATEMENTS 然后指定阈值和存储路径。
  2. 然后用db2exfmt工具分析:DB2把慢SQL的记录(通常在一个文件里)保存下来后,你就可以运行 db2exfmt 命令来解析这个文件,这个命令会输出一个文本格式的报告,这就是我们想看的执行计划详情。

拿到执行计划报告,看啥?

报告可能有点长,但作为初步了解,你不需要看懂每一行,抓住几个关键点就行。

  1. 看总成本(Total Cost):报告开头通常会有一个总的预估成本值,这个数字本身大小不重要(因为硬件不同没法直接比),重要的是当你对SQL进行优化后(比如加了索引),再对比两次的成本值是否显著下降,下降了就说明优化可能起效了。

  2. 看执行步骤里的“大头”(昂贵的操作):报告里会把整个执行过程分解成一步步,你要找那些占比最大、最耗时的操作,常见的“坏分子”有:

    • TBSCAN(表扫描):这就像在图书馆里找一本书,你不是通过索引卡片查位置,而是从第一个书架开始,一排排、一本本地翻过去,如果表很大,这个操作就会非常慢,如果你在SQL的查询条件字段(客户ID”)上明明有索引,但计划里还是出现了TBSCAN,那通常就是个警告信号。
    • IXSCAN(索引扫描)后接FETCH(抓取):这通常是好现象,它表示先通过索引快速定位到符合条件的数据位置(就像用索引卡片查书),然后再根据地址去把整行数据取出来。
    • SORT(排序):如果SQL里有 ORDER BYGROUP BY 或者 DISTINCT,很可能需要排序,排序也是非常消耗内存和CPU的操作,如果排序的数据量很大,就会成为瓶颈。
    • NLJOIN(嵌套循环连接)HSJOIN(哈希连接):这是两种连接表的方式,简单说,NLJOIN适合连接两个表中一个很小一个很大的情况,它像两层循环,外层循环小表,内层循环大表,HSJOIN适合连接两个都很大的表,它先给一个表建个“哈希表”(类似快速查找字典),再用另一个表去匹配,执行计划会选择它认为最快的方式,如果选错了,就会慢。
  3. 看预估和实际的差距:高级一点的监控(比如用db2expln工具或者在管理工具里看)还能看到每一步骤“预估返回的行数”和“实际返回的行数”,如果这两个数差得很远,比如预估100行,实际返回了100万行,那就说明DB2的“优化器”当时判断失误了,它基于错误的信息(比如过时的统计信息)制定了一个糟糕的计划,这是导致“烂计划”最常见的原因之一。

简单了解一下后,能干啥?

知道了是哪个步骤慢,以及为什么慢,你就可以采取行动了:

  1. 更新统计信息:这是首选的、最简单有效的办法,DB2依靠关于表大小、数据分布等统计信息来制定计划,如果信息过时了,它就会“瞎指挥”,运行 RUNSTATS 命令(RUNSTATS ON TABLE 你的表名)来刷新统计信息,然后DB2可能会自动生成一个更好的计划。
  2. 考虑加索引:如果发现慢SQL总是在某个字段上做全表扫描(TBSCAN),而那个字段又经常用在查询条件里,那么为这个字段创建一个索引可能就是最快的解决办法。
  3. 优化SQL写法:是你写的SQL语句本身把DB2“带跑偏”了,避免在查询条件里对字段做计算或函数处理(如 WHERE UPPER(name) = 'SMITH'),因为这会导致索引失效,试着把SQL写得更加简洁、直接。

在DB2里监控SQL执行计划,核心就是用db2exfmt这样的工具把慢SQL的计划抓出来,然后重点看有没有全表扫描、排序是不是太重、连接方式合不合理,以及预估和实际行数差距大不大,基于这些观察,优先尝试更新统计信息,再考虑建索引或改SQL,这个过程一开始可能有点陌生,但多看几次,你就能对数据库的“内心活动”有个基本的了解了。

(注:以上方法主要参考自IBM官方文档中关于DB2性能调优和解释工具(db2exfmt, db2expln)的说明,以及常见的数据库性能优化实践。)

DB2里头SQL执行计划咋监控和简单了解一下吧