互联网服务

关于sql编译耗时的问题

在查看DB2快照的时候发现一条sql语句。该条sql包含了近20个从其他表的取值函数,主要是从一个字典表取值,字典表大小约1.6W数据。
该条sql在应用系统后台中查看执行的时间大概是2.6秒,然后我用工具连接数据库去执行也是大概2.6秒,然后用DB2CMD连接数据库去执行也是差不多2.6秒(用的时间戳);结果集都控制到10条,相同的sql后再加上主键 in('',……''),保证都是10条结果,每次执行都是微调 in 里的主键参数,保证都会重新编译执行。
但是我在DB2的快照中找到该类sql的记录时 Total execution time (sec.ms) 只有0.1秒左右(执行一次)。

但是当我将sql改为预编译模式去执行的时候,应用系统后台查看执行时间除了首次是2.6秒左右外,更换查询条件后都是0.4秒左右。查看数据库快照的时候找到该预编译sql 的Total execution time (sec.ms) 的值大概是10秒,执行了26次,平均下来约0.4秒,比较相符。

从这个例子看DB2编译sql生成执行计划的时间在Statement的快照中没有体现出来,编译的时间而且在2.5秒左右。。


但是我在本地搭建了一个环境,字典表数据大多一样,大小约1W数据,其他数据都是我自己造的,数据量相差不大,改造了一个sql,变为有20个取值函数(多为取字典表的的值),但是sql的执行时间都是0.4秒以内。也就是说sql编译时间基本可以忽略掉了。

这个是怎么一回事?

上面的DB2版本是V8.1,本地是以前搭建的环境,V9.1,表结构都差别不大。

附件:

附件图标out.txt (127.44 KB)

附件图标outacms.txt (870.03 KB)

参与56

54同行回答

ljbupcljbupc软件开发工程师上海安硕科技
db2batch本地的弄出来了..明天去看看那机器上的.* 访存了 22 行,有 22 行输出。* 准备时间是:       0.068401 秒* 执行时间是:       0.057822 秒* 访存时间是:       0.004254 秒* 耗用时间是:   &n...显示全部
db2batch本地的弄出来了..明天去看看那机器上的.

* 访存了 22 行,有 22 行输出。

* 准备时间是:       0.068401 秒
* 执行时间是:       0.057822 秒
* 访存时间是:       0.004254 秒
* 耗用时间是:       0.130477 秒(完整执行时间)

* 总结表:


类型 数目        重复        总时间(s)    最小时间(s)  最大时间(s)  算术平均时间   几何平均时间   访存的行数  输出的行数

---- ----------- ----------- -------------- -------------- -------------- -------------- -------------- ----------- -----------

语句           1           1       0.130477       0.130477       0.130477       0.130477       0.130477          22          22


* 总条目数:                  1
* 总时间:                    0.130477 秒
* 最小时间:                  0.130477 秒
* 最大时间:                  0.130477 秒
* 算术平均时间:              0.130477 秒
* 几何平均时间:              0.130477 秒
---------------------------------------------收起
互联网服务 · 2012-04-08
浏览1031
lcyaolcyao软件开发工程师VP科技股份有限公司
最近有个很长的sql,,,编译执行想当费时...这个帖子收了好好看下.显示全部
最近有个很长的sql,,,编译执行想当费时...这个帖子收了好好看下.收起
银行 · 2014-05-22
浏览1591
ljbupcljbupc软件开发工程师上海安硕科技
回复 53# mdkii 一样的。。。就算是调了DFT_QUERYOPT 也是一样。。显示全部
回复 53# mdkii
一样的。。。
就算是调了DFT_QUERYOPT 也是一样。。收起
互联网服务 · 2012-04-12
浏览1626
mdkiimdkii软件开发工程师bocn
回复  mdkii 可是我将STMTHEAP 调小后,编译速度确实明显加快了啊。20480 编译时间:3.2,8192 编译时间 ...ljbupc 发表于 2012-4-11 22:37 你的得到的执行计划是一样的吗?显示全部
回复  mdkii
可是我将STMTHEAP 调小后,编译速度确实明显加快了啊。20480 编译时间:3.2,
8192 编译时间 ...
ljbupc 发表于 2012-4-11 22:37

你的得到的执行计划是一样的吗?收起
银行 · 2012-04-12
浏览1592
ljbupcljbupc软件开发工程师上海安硕科技
回复 35# wangzhonnew 非常感谢大师的解答与分享~显示全部
回复 35# wangzhonnew
非常感谢大师的解答与分享~收起
互联网服务 · 2012-04-12
浏览1586
ljbupcljbupc软件开发工程师上海安硕科技
谢谢夏宁了。。我想估计DB2的编译程序还有一定的差别吧,有空的时候我多搭建几个不同DB2版本的环境来试试。。显示全部
谢谢夏宁了。。
我想估计DB2的编译程序还有一定的差别吧,有空的时候我多搭建几个不同DB2版本的环境来试试。。收起
互联网服务 · 2012-04-12
浏览1584
ljbupcljbupc软件开发工程师上海安硕科技
回复 49# tongjixianing 回复 49# tongjixianing 额。。库比较的多。。。1、开发库 和 去年的开发库 V81,windows ,在同一实例下的两个库。前一段时间 两个库的编译时间大概相差3倍(3秒左右和9秒左右),我将日志大小从40000调到了10000,然后两者相差不大了(都是3秒)。然后再将 STM...显示全部
回复 49# tongjixianing
回复 49# tongjixianing
额。。库比较的多。。。1、开发库 和 去年的开发库 V81,windows ,在同一实例下的两个库。
前一段时间 两个库的编译时间大概相差3倍(3秒左右和9秒左右),我将日志大小从40000调到了10000,然后两者相差不大了(都是3秒)。
然后再将 STMTHEAP 从 20480 调到8192后,编译时间变为 1.7秒,再调小到4096后为 0.77秒。
2、我本地电脑有一个库 V9.1.5 windows 无论怎么调STMTHEAP 编译时间都是0.05左右;
3、一个测试库 ,V9.1.6 AIX ,编译时间约为3.5秒,STMTHEAP 为20480;
4、一个验证库,V9.1.6 AIX ,编译时间约为1.8秒,STMTHEAP 为 4096。


我就是看到 测试库和验证库上面的差别,我才在开发库上调小了STMTHEAP(因为我在本地无论怎么调都不变,有点想放弃调的),结果真有用。
不过测试和验证库我不能随便改参数。


5、一个生产库,V9.1.6 AIX ,我直接没有权限。。


大概就是这么个样了。。收起
互联网服务 · 2012-04-12
浏览1599
tongjixianingtongjixianing软件开发工程师IBM
ok,你有三个库?v8的生产库,减小stmtheap,prepare时间有提高。v91的生产库,不论增大,减小stmtheap,prepare的时间都很快v91测试库是什么情况?显示全部
ok,你有三个库?

v8的生产库,减小stmtheap,prepare时间有提高。
v91的生产库,不论增大,减小stmtheap,prepare的时间都很快
v91测试库是什么情况?收起
互联网服务 · 2012-04-12
浏览1581
ljbupcljbupc软件开发工程师上海安硕科技
回复 47# mdkii 可是我将STMTHEAP 调小后,编译速度确实明显加快了啊。20480 编译时间:3.2,8192 编译时间:1.7,4096 编译时间:0.77.都是同一条sql对IN语句的一个条件微调后多次 db2batch的平均值。感觉是有问题在这里。。...显示全部
回复 47# mdkii
可是我将STMTHEAP 调小后,编译速度确实明显加快了啊。20480 编译时间:3.2,
8192 编译时间:1.7,
4096 编译时间:0.77.
都是同一条sql对IN语句的一个条件微调后多次 db2batch的平均值。
感觉是有问题在这里。。收起
互联网服务 · 2012-04-11
浏览1579
mdkiimdkii软件开发工程师bocn
我觉得 理论上讲,在固定版本的DB2上,在得到同样执行计划的情况下,编译速度是无法改变的,除非你换更快的CPU。作为DBA,你可以在最优计划和编译效率之间权衡。如果你想加快编译速度,那么你得降低 优化等级,这样付出的代价是你可能会得到次优的执行计划。...显示全部
我觉得 理论上讲,在固定版本的DB2上,在得到同样执行计划的情况下,编译速度是无法改变的,
除非你换更快的CPU。
作为DBA,你可以在最优计划和编译效率之间权衡。如果你想加快编译速度,那么你得降低 优化等级,
这样付出的代价是你可能会得到次优的执行计划。收起
银行 · 2012-04-11
浏览1571

提问者

ljbupc
软件开发工程师上海安硕科技

问题状态

  • 发布时间:2012-04-07
  • 关注会员:1 人
  • 问题浏览:27662
  • 最近回答:2014-05-22
  • X社区推广