DB2中Dynamic SQL Variation以及Varlock (V lock,Internal V lock)详解
简介:
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)详解相关推荐
- db2 联合数据源 mysql_详解DB2中联合SQL Server数据
[51CTO独家特稿]DB2中联合SQL Server步骤: 1.安装DB2 2.安装IBM DataDirect ODBC驱动 3.安装关系连接器 或安装InfoSphere DB2(InfoSph ...
- (转)web.xml 中的listener、 filter、servlet 加载顺序及其详解
转: https://www.cnblogs.com/Jeely/p/10762152.html web.xml 中的listener. filter.servlet 加载顺序及其详解 一.概述 1. ...
- nmmqq.php?/lspc.html,html中的图片直接使用base64编码后的字符串代替详解
网页中的图片是使用base64编码后的字符串代替了,这个叫做Data URI scheme,下面有个不错的示例,大家可以参考下 最近来了一个网页,里面有图片,但是却没有引用外部的图片资源,很好奇.查看 ...
- python使用视频_Python中操作各种多媒体,视频、音频到图片的代码详解
我们经常会遇到一些对于多媒体文件修改的操作,像是对视频文件的操作:视频剪辑.字幕编辑.分离音频.视频音频混流等.又比如对音频文件的操作:音频剪辑,音频格式转换.再比如我们最常用的图片文件,格式转换.各 ...
- python播放视频代码_Python中操作各种多媒体,视频、音频到图片的代码详解
我们经常会遇到一些对于多媒体文件修改的操作,像是对视频文件的操作:视频剪辑.字幕编辑.分离音频.视频音频混流等.又比如对音频文件的操作:音频剪辑,音频格式转换.再比如我们最常用的图片文件,格式转换.各 ...
- php self this static,PHP 中 self、static、$this 的区别和后期静态绑定详解
本篇文章给大家分享的内容是关于PHP 中 self.static.$this 的区别和后期静态绑定详解,有着一定的参考价值,有需要的朋友可以参考一下 self.static 和 $this 的区别 为 ...
- java构造块_java中的静态代码块、构造代码块、构造方法详解
运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...
- Java中常见RuntimeException与其他异常表及Exception逻辑关系详解
Java中常见RuntimeException与其他异常表及Exception逻辑关系详解 前言 常见`RuntimeException` 其他错误类型 `Error`类 `Exception`类 E ...
- java ant解压缩_java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解
java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解 发布于 2020-4-7| 复制链接 摘记: java ant包中的org.apache.tools.zip实现 ...
- 多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解
多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解 1. 概览 在开始具体讨论卡尔曼滤波和匈牙利算法之前,首先我们来看一下基于检测的目标跟踪算法的大 ...
最新文章
- [ios] 微信订阅号: ios博文精选
- Pycharm如何自动换行
- 调用图片文件夹中的任意图片随机显示_【分享】文字、表格、公式图片识别神器V0.8...
- 带你探索CPU调度的奥秘
- 重庆c语言历届试题,历届重庆市计算机C语言二级考试试题及答案.doc
- 计算机中华五岳说课稿,关于说课稿集合6篇
- 2020中兴捧月算法大赛参赛总结
- 阳振坤:OceanBase 数据库七亿 tpmC 的关键技术
- 如何用十步写一首原创歌曲
- python成绩统计及格学平成_强化学习训练Chrome小恐龙Dino:最高超过4000分
- 视频封装格式篇--MP4
- 苹果vpn是下一件大事
- PHP implode和explode用法
- 【数据结构-树】哈夫曼树及其应用
- tensorflow学习系列
- 判断A图层完全包含B图层的要素--(1)空间查询之esriSpatialRelEnum.esriSpatialRelContains(包含)
- SonicwALL NSA-4600 防火墙基本介绍
- Vue-路由传参的方法与区别
- 数字地图将成正果【转载】
- 办公必备的大数据分析利器,数据分析工具推荐
热门文章
- 怎么做好职业道德与职业素养培训PPT?
- 百度开发者大会全国巡讲开始、Scrum Gathering蓄势待发
- iis安装后没有信息服务器,iis安装没有ftp服务器
- spring boot快速入门 10: 日志使用
- 初中几年级开始学计算机,小学几年级,学生开始拉开差距,几年级成绩定型?听听老师怎么说...
- 批量查询物流信息标记已签收单号
- Upload-labs文件上传漏洞(大小写绕过)——Pass05
- 三轴防抖加持,体积还挺袖珍,随拍ATOM2手机云台上手
- 软测—直播教学—真题实战2,禅道管理用例
- 专注,无论哪一行都很重要,尤其在竞赛,谈伊万输给梅克维耶尔,罗马站