haoqingyun
作者haoqingyun·2014-05-16 18:52
数据库运维工程师·CMBC

看看 DB2 trigger 的内部工作原理

字数 5704阅读 3501评论 1赞 1

随手写一篇。

今天有同事突然问起DB2里面trigger的工作原理,说实话,一开始还真没啥概念。。。

使用方法上看,trigger不就是一个触发器,当一个表上有IUD操作的时候触发另一个操作么。。那DB2 engine内部是怎么实现的呢。。。

找了半天,没找到啥内部文档,于是想了一下,应该是在compile过程实现的。就是说编译的时候把trigger所要触发的操作考虑进去,生成一个执行计划把两件事一起做了。

做了一个小实验,创建了一个trigger,当一个表上有insert的时候,向另一个表插入一行。

db2 "create table t1 (c1 int not null primary key,c2 varchar(100))"

db2 "create table t2 (c1 int)"

db2 "create trigger mytrig after insert on t1 for each row insert into t2 values(1)"

然后去看insert into t1的时候的执行计划。

db2 -tvf sqllib/misc/EXPLAIN.DDL

db2 set current explain mode explain

db2 "insert into t1 values(1234, 'hehe')"

db2exfmt -d dbname -1 -o db2exfmt.out

得到执行计划如下:

Original Statement:
------------------
insert into t1 values(1234, 'hehe')

Optimized Statement:
-------------------
$WITH CONTEXT$($TRIGGER$(HAOQINGY.MYTRIG))
INSERT INTO HAOQINGY.T1 AS Q3
   SELECT 'hehe', 1234
   FROM (VALUES 1) AS Q1

Access Plan:
-----------
        Total Cost:             16.387
        Query Degree:           1

                         Rows
                        RETURN
                        (   1)
                         Cost
                          I/O
                          |
                         0.04
                        FILTER
                        (   2)
                        16.387
                           2
                /---------+----------
               1                      0.96
            INSERT                   INSERT
            (   3)                   (   5)
            8.0848                   8.1026
               1                        1
          /---+---                /---+---
         1          64          0.96         64
      TBSCAN  TABLE: HAOQINGY  TBSCAN  TABLE: HAOQINGY
      (   4)        T1         (   6)        T2
      0.0048        Q3         0.0226        Q8
         0                        0
        |                        |
         1                        1
 TABFNC: SYSIBM           TABFNC: SYSIBM
      GENROW                   GENROW

可以看到,左边那条腿是做insert into t1的,右边那条腿是做insert into t2的。

而原始语句是“insert into t1 values(1234, 'hehe')”。

这样,事情就比较明白了。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论1 条评论

daolin2005daolin2005数据库管理员某城商行
2014-06-03 21:31
db2exfmt的结果验证了楼主的猜想。good.!感谢分享。
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广