简介:

Dynamic SQL Variation 可以认为是Db2内部的一种变量,存放在Dynamic SQL Cache(package cache的一部分)中,每个Variation对应一条编译的动态SQL语句,也就是说,每当Db2编译了一条动态SQL,SQL cache中就会多一个variation,在variation上的加的锁即是Variation Lock(简称V lock 或 VarLock)。为了确保variation有效,SQL执行期间需要在其对应的variation上加锁,详细的加锁方案如下:
如果待执行SQL已在SQL Cache中,应用会在其对应的variation上加一个S锁,这个S锁可以确保SQL执行期间的有效性(比如,删除一张表会使依赖这张表的所有variation失效)。
如果待执行SQL不在SQL Cache中,那么需要编译该SQL,编译期间为了把variation加载(loading)到cache中,会在编译开始前对该variation加一个X类型的锁,这个锁被称之为V loading lock,等编译完成之后,就会释放该锁。X类型V loading lock的目地是为了确保只有这一个应用编译该SQL(编译SQL的代价非常高,只需要编译一次即可,之后不管是同一个应用还是其他应用,要执行相同的SQL就不必再重新编译)。如果应用A拿到了X类型的 V Loading lock,在进行编译期间,有应用B也想编译,那应用B也会尝试获取同一个V loading lock,不过是S类型的。

db2pd工具

为了对Dynamic SQL Variations有一个直观的理解,可以使用db2pd的dynamic选项查看内存中有哪些Dynamic SQL Variation:

测试用到的命令如下,测试之前请确保数据库是未激活状态:

$ db2 +o terminate
$ db2 +o connect to sample
$ db2pd -d sample -dyn
$ db2 +o "list tables"
$ db2 +o "select * from t1 fetch first 1 rows only"
$ db2 +o "describe table t2"
$ db2  "insert into t2 values(10,'aaa')"
$ db2pd -d sample -dyn
$ db2  "insert into t2 values(10,'aaa')"
$ db2pd -d sample -dyn

1. 刚连接库, 未发出过动态SQL,发现没有Dynamic SQL Variations

inst105@node01:~$ db2 +o terminate
inst105@node01:~$ db2 +o connect to sample
inst105@node01:~$ db2pd -d sample -dynDatabase Member 0 -- Database SAMPLE -- Active -- Up 0 days 00:00:03 -- Date 2019-04-19-05.54.19.052052Dynamic Cache:
Current Memory Used           199632
Total Heap Size               5236572
Cache Overflow Flag           0
Number of References          0
Number of Statement Inserts   0
Number of Statement Deletes   0
Number of Variation Inserts   0
Number of Statements          0Dynamic SQL Statements:
Address            AnchID StmtUID    NumEnv     NumVar     NumRef     NumExe     Text Dynamic SQL Environments:
Address            AnchID StmtUID    EnvID      Iso QOpt BlkDynamic SQL Variations:
Address            AnchID StmtUID    EnvID      VarID      NumRef     Typ Lockname                   Val Insert Time                Sect Size  Num Copies

2. 发出4条语句之后,有4个Dynamic SQL Statements,可以根据AnchID和StmtUID找到对应的SQL语句(可以看到list tables和describe table命令也被Db2转化为动态SQL执行了):

inst105@node01:~$ db2 +o "list tables"
inst105@node01:~$ db2 +o "select * from t1 fetch first 1 rows only"
inst105@node01:~$ db2 +o "describe table t2"
inst105@node01:~$ db2 "insert into t2 values(10,'aaa')"
DB20000I  The SQL command completed successfully.
inst105@node01:~$ db2pd -d sample -dynDatabase Member 0 -- Database SAMPLE -- Active -- Up 0 days 00:00:24 -- Date 2019-04-19-05.54.40.171977Dynamic Cache:
Current Memory Used           643435
Total Heap Size               5236572
Cache Overflow Flag           0
Number of References          4
Number of Statement Inserts   8
Number of Statement Deletes   4
Number of Variation Inserts   4
Number of Statements          4Dynamic SQL Statements:
Address            AnchID StmtUID    NumEnv     NumVar     NumRef     NumExe     Text
0x00007F60ACF51EA0 116    1          1          1          1          1          SELECT TABNAME, TABSCHEMA, TYPE, CREATE_TIME FROM SYSCAT.TABLES WHERE TABSCHEMA = USER ORDER BY TABSCHEMA, TABNAME
0x00007F60AFD994E0 854    1          1          1          1          1          insert into t2 values(10,'aaa')
0x00007F60ACF5ABA0 904    1          1          1          1          1          select * from t1 fetch first 1 rows only
0x00007F60ACF5FD60 988    1          1          1          1          1          SELECT COLNAME, TYPESCHEMA, TYPENAME, LENGTH, SCALE, NULLS FROM SYSCAT.COLUMNS WHERE TABSCHEMA = CURRENT SCHEMA AND TABNAME = 'T2' ORDER BY COLNODynamic SQL Environments:
Address            AnchID StmtUID    EnvID      Iso QOpt Blk
0x00007F60ACF52060 116    1          1          CS  5    B
0x00007F60AFD99640 854    1          1          CS  5    B
0x00007F60ACF5AD00 904    1          1          CS  5    B
0x00007F60AFD90080 988    1          1          CS  5    BDynamic SQL Variations:
Address            AnchID StmtUID    EnvID      VarID      NumRef     Typ Lockname                   Val Insert Time                Sect Size  Num Copies
0x00007F60ACF523E0 116    1          1          1          1          6   01000000010000000100800ED6 Y   2019-04-19-05.54.23.368394 16888      0
0x00007F60AFD999C0 854    1          1          1          1          4   01000000010000000100C06AD6 Y   2019-04-19-05.54.36.155828 5336       1
0x00007F60ACF5B080 904    1          1          1          1          6   010000000100000001000071D6 Y   2019-04-19-05.54.27.488288 5560       1
0x00007F60AFD90340 988    1          1          1          1          6   01000000010000000100807BD6 Y   2019-04-19-05.54.31.645792 18432      1    

3. 再执行一次相同的SQL,发现还是用的原来的 Variation,只是NumRef增加了1.

inst105@node01:~$ db2  "insert into t2 values(10,'aaa')"
DB20000I  The SQL command completed successfully.
inst105@node01:~$ db2pd -d sample -dynDatabase Member 0 -- Database SAMPLE -- Active -- Up 0 days 00:00:32 -- Date 2019-04-19-05.54.48.034430Dynamic Cache:
Current Memory Used           643435
Total Heap Size               5236572
Cache Overflow Flag           0
Number of References          5
Number of Statement Inserts   8
Number of Statement Deletes   4
Number of Variation Inserts   4
Number of Statements          4Dynamic SQL Statements:
Address            AnchID StmtUID    NumEnv     NumVar     NumRef     NumExe     Text
0x00007F60ACF51EA0 116    1          1          1          1          1          SELECT TABNAME, TABSCHEMA, TYPE, CREATE_TIME FROM SYSCAT.TABLES WHERE TABSCHEMA = USER ORDER BY TABSCHEMA, TABNAME
0x00007F60AFD994E0 854    1          1          1          2          2          insert into t2 values(10,'aaa')
0x00007F60ACF5ABA0 904    1          1          1          1          1          select * from t1 fetch first 1 rows only
0x00007F60ACF5FD60 988    1          1          1          1          1          SELECT COLNAME, TYPESCHEMA, TYPENAME, LENGTH, SCALE, NULLS FROM SYSCAT.COLUMNS WHERE TABSCHEMA = CURRENT SCHEMA AND TABNAME = 'T2' ORDER BY COLNODynamic SQL Environments:
Address            AnchID StmtUID    EnvID      Iso QOpt Blk
0x00007F60ACF52060 116    1          1          CS  5    B
0x00007F60AFD99640 854    1          1          CS  5    B
0x00007F60ACF5AD00 904    1          1          CS  5    B
0x00007F60AFD90080 988    1          1          CS  5    BDynamic SQL Variations:
Address            AnchID StmtUID    EnvID      VarID      NumRef     Typ Lockname                   Val Insert Time                Sect Size  Num Copies
0x00007F60ACF523E0 116    1          1          1          1          6   01000000010000000100800ED6 Y   2019-04-19-05.54.23.368394 16888      0
0x00007F60AFD999C0 854    1          1          1          2          4   01000000010000000100C06AD6 Y   2019-04-19-05.54.36.155828 5336       1
0x00007F60ACF5B080 904    1          1          1          1          6   010000000100000001000071D6 Y   2019-04-19-05.54.27.488288 5560       1
0x00007F60AFD90340 988    1          1          1          1          6   01000000010000000100807BD6 Y   2019-04-19-05.54.31.645792 18432      1     

4. 如果有其他的应用,执行相同的SQL,也不会有新的Dynamic SQL Variations。

Trace工具

为了进一步验证上面的说法,可以抓取trace,做一个简单的分析。脚本如下:

db2stop force && db2start
db2 connect to sample
sleep 2db2 -x 'values MON_GET_APPLICATION_HANDLE()' | awk '{print $1}' > currentAgentID
appHdl=`cat currentAgentID`
db2trc on -t -apphdl $appHdl -f db2trace.dmp for i in 1 2 3 4 5
dodb2 +o "select * from t1 fetch first 1 rows only"sleep 2
donedb2trc off
db2trc flw -t db2trace.dmp  db2trace.flw
db2trc fmt db2trace.dmp db2trace.fmt
db2pd -d sample -dynamic > db2pd.dyn.out
db2 +o terminate
echo "Script ends" 

输出中可以看到SQL执行了5次(NumRef):

inst105@node01:~/20190419$ cat db2pd.dyn.out Database Member 0 -- Database SAMPLE -- Active -- Up 0 days 00:00:18 -- Date 2019-04-19-06.22.34.333059Dynamic Cache:
Current Memory Used           568245
Total Heap Size               5236572
Cache Overflow Flag           0
Number of References          6
Number of Statement Inserts   2
Number of Statement Deletes   0
Number of Variation Inserts   2
Number of Statements          2Dynamic SQL Statements:
Address            AnchID StmtUID    NumEnv     NumVar     NumRef     NumExe     Text
0x00007FEE60F51040 651    1          1          1          1          1          values MON_GET_APPLICATION_HANDLE()
0x00007FEE60F56680 904    1          1          1          5          5          select * from t1 fetch first 1 rows onlyDynamic SQL Environments:
Address            AnchID StmtUID    EnvID      Iso QOpt Blk
0x00007FEE60F511A0 651    1          1          CS  5    B
0x00007FEE60F567E0 904    1          1          CS  5    BDynamic SQL Variations:
Address            AnchID StmtUID    EnvID      VarID      NumRef     Typ Lockname                   Val Insert Time                Sect Size  Num Copies
0x00007FEE60F51520 651    1          1          1          1          6   010000000100000001006051D6 Y   2019-04-19-06.22.21.009028 6840       0
0x00007FEE60F56B60 904    1          1          1          5          6   010000000100000001000071D6 Y   2019-04-19-06.22.22.333892 5560       1 

查看Trace中锁的名子,loading = 1表示是V loading lock,可以看到V loading lock的lockname和其他基本一样(只差了一位):

inst105@node01:~/20190419$ grep lockname  db2trace.fmt | grep -i VARIATIONlockname 010000000100000001000171D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 1, )lockname 010000000100000001000171D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 1, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000171D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 1, )lockname 010000000100000001000171D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 1, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )lockname 010000000100000001000071D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 0, )

如果进一步分析trace文件,还可以验证很多结论,比如,加的V loading lock是X类型的:

1428    entry DB2 UDB lock manager sqlplrq fnc (1.3.35.22.0)pid 10054 tid 140663370802944 cpid 10075 node 0 sec 0 nsec 3299000eduid 22 eduname db2agentbytes 152Data1   (PD_TYPE_SQLP_LOCK_INFO,144) SQLP_LOCK_INFO:lockname 010000000100000001000171D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 1, )pLRB (nil) prevIntent NON curIntent NON intent ..X duration 1rlInFlags 0x00000001 rlOutFlags 0x00000000 rlTimeout 0xFFFFFFFE cursorBitmap 0x40000000 rrIIDin 0 rrIIDout 0 priority 0 pEHLState 0000000000000000rlUserData.UNKNOWN 0000 0000 0000 0000                        ........dataPtr (nil)1429    exit DB2 UDB lock manager sqlplrq fnc (2.3.35.22.0)pid 10054 tid 140663370802944 cpid 10075 node 0 sec 0 nsec 3302000rc = 0bytes 288Data1   (PD_TYPE_SQLP_LOCK_INFO,144) SQLP_LOCK_INFO:lockname 010000000100000001000171D6 SQLP_VARIATION (anchor,stmt,env,var={904,1,1,1}, loading = 1, )pLRB 0x7fee44354f00 prevIntent NON curIntent ..X intent ..X duration 1rlInFlags 0x00000001 rlOutFlags 0x00000000 rlTimeout 0xFFFFFFFE cursorBitmap 0x40000000 rrIIDin 0 rrIIDout 0 priority 2 pEHLState 0000000000000000rlUserData.UNKNOWN 0000 0000 0000 0000                        ........dataPtr (nil)Data2   (PD_TYPE_SQLP_LRB,128) SQLP_LRB:state L (0x04) next (nil) rsInfoIdx 0prev (nil) tranChainPrev (nil)status G (0x01) mode ..X dur 1 convMode NON tran_handl 3holdcount 0 wantrrIID 0  rrIID 0  lrbFlag 0x0 chainNum 0 lsoFeedback 0tran_chain 0x7fee44354200 head_ptr 0x7fee44354e80 awb_ptr (nil)cursorBitmap 0x40000000 hashResult 1517 wantAttributes 00 priority 2 pad2 00

又比如:
第一次跑SQL,对V lock操作顺序如下: 加X类型的V loading lock (010000000100000001000171D6),加S类型的V lock(010000000100000001000071D6),释放X类型的V loading lock,释放S类型的V lock。
之后的4次SQL,因此SQL Cache中已经有variation, 所以再没有需要过V loading lock,只是简单的加V lock,释放V lock

再比如:
compile SQL的代价真的很高,从开始1436到结束的17737:

inst105@node01:~/20190419$ grep 'sqlra_compile_var entry' db2trace.flw 
1436           0.003305000   | | | | | | sqlra_compile_var entry [eduid 22 eduname db2agent]
inst105@node01:~/20190419$ grep 'sqlra_compile_var exit' db2trace.flw 
17737          0.182564000   | | | | | | sqlra_compile_var exit
而运行5次SQL才一共39039:
inst105@node01:~/20190419$ tail -n 2 db2trace.flw
39038          9.400739000   | | sqlccipcrecv data [probe 55]
39039          9.400740000   | | | sqloSSemP entry [eduid 22 eduname db2agent]

再比如:Db2是先获得了X类型的V loading lock(Trace中1428条目),然后才开始编译(Trace中1436条目),也就是说编码的前置条件是已经获得了X类型的V loading lock。

DB2中Dynamic SQL Variation以及Varlock (V lock,Internal V lock)详解相关推荐

  1. db2 联合数据源 mysql_详解DB2中联合SQL Server数据

    [51CTO独家特稿]DB2中联合SQL Server步骤: 1.安装DB2 2.安装IBM DataDirect ODBC驱动 3.安装关系连接器 或安装InfoSphere DB2(InfoSph ...

  2. (转)web.xml 中的listener、 filter、servlet 加载顺序及其详解

    转: https://www.cnblogs.com/Jeely/p/10762152.html web.xml 中的listener. filter.servlet 加载顺序及其详解 一.概述 1. ...

  3. nmmqq.php?/lspc.html,html中的图片直接使用base64编码后的字符串代替详解

    网页中的图片是使用base64编码后的字符串代替了,这个叫做Data URI scheme,下面有个不错的示例,大家可以参考下 最近来了一个网页,里面有图片,但是却没有引用外部的图片资源,很好奇.查看 ...

  4. python使用视频_Python中操作各种多媒体,视频、音频到图片的代码详解

    我们经常会遇到一些对于多媒体文件修改的操作,像是对视频文件的操作:视频剪辑.字幕编辑.分离音频.视频音频混流等.又比如对音频文件的操作:音频剪辑,音频格式转换.再比如我们最常用的图片文件,格式转换.各 ...

  5. python播放视频代码_Python中操作各种多媒体,视频、音频到图片的代码详解

    我们经常会遇到一些对于多媒体文件修改的操作,像是对视频文件的操作:视频剪辑.字幕编辑.分离音频.视频音频混流等.又比如对音频文件的操作:音频剪辑,音频格式转换.再比如我们最常用的图片文件,格式转换.各 ...

  6. php self this static,PHP 中 self、static、$this 的区别和后期静态绑定详解

    本篇文章给大家分享的内容是关于PHP 中 self.static.$this 的区别和后期静态绑定详解,有着一定的参考价值,有需要的朋友可以参考一下 self.static 和 $this 的区别 为 ...

  7. java构造块_java中的静态代码块、构造代码块、构造方法详解

    运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...

  8. Java中常见RuntimeException与其他异常表及Exception逻辑关系详解

    Java中常见RuntimeException与其他异常表及Exception逻辑关系详解 前言 常见`RuntimeException` 其他错误类型 `Error`类 `Exception`类 E ...

  9. java ant解压缩_java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解

    java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解 发布于 2020-4-7| 复制链接 摘记: java ant包中的org.apache.tools.zip实现 ...

  10. 多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解

    多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解 1. 概览 在开始具体讨论卡尔曼滤波和匈牙利算法之前,首先我们来看一下基于检测的目标跟踪算法的大 ...

最新文章

  1. [ios] 微信订阅号: ios博文精选
  2. Pycharm如何自动换行
  3. 调用图片文件夹中的任意图片随机显示_【分享】文字、表格、公式图片识别神器V0.8...
  4. 带你探索CPU调度的奥秘
  5. 重庆c语言历届试题,历届重庆市计算机C语言二级考试试题及答案.doc
  6. 计算机中华五岳说课稿,关于说课稿集合6篇
  7. 2020中兴捧月算法大赛参赛总结
  8. 阳振坤:OceanBase 数据库七亿 tpmC 的关键技术
  9. 如何用十步写一首原创歌曲
  10. python成绩统计及格学平成_强化学习训练Chrome小恐龙Dino:最高超过4000分
  11. 视频封装格式篇--MP4
  12. 苹果vpn是下一件大事
  13. PHP implode和explode用法
  14. 【数据结构-树】哈夫曼树及其应用
  15. tensorflow学习系列
  16. 判断A图层完全包含B图层的要素--(1)空间查询之esriSpatialRelEnum.esriSpatialRelContains(包含)
  17. SonicwALL NSA-4600 防火墙基本介绍
  18. Vue-路由传参的方法与区别
  19. 数字地图将成正果【转载】
  20. 办公必备的大数据分析利器,数据分析工具推荐

热门文章

  1. 怎么做好职业道德与职业素养培训PPT?
  2. 百度开发者大会全国巡讲开始、Scrum Gathering蓄势待发
  3. iis安装后没有信息服务器,iis安装没有ftp服务器
  4. spring boot快速入门 10: 日志使用
  5. 初中几年级开始学计算机,小学几年级,学生开始拉开差距,几年级成绩定型?听听老师怎么说...
  6. 批量查询物流信息标记已签收单号
  7. Upload-labs文件上传漏洞(大小写绕过)——Pass05
  8. 三轴防抖加持,体积还挺袖珍,随拍ATOM2手机云台上手
  9. 软测—直播教学—真题实战2,禅道管理用例
  10. 专注,无论哪一行都很重要,尤其在竞赛,谈伊万输给梅克维耶尔,罗马站