互联网服务

关于sql编译耗时的问题

在查看DB2快照的时候发现一条sql语句。该条sql包含了近20个从其他表的取值函数,主要是从一个字典表取值,字典表大小约1.6W数据。该条sql在应用系统后台中查看执行的时间大概是2.6秒,然后我用工具连接数据库去执行也是大概2.6秒,然后用DB2CMD连接数据库去执行也是差不多2.6秒(...显示全部
在查看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

查看其它 53 个回答wangzhonnew的回答

wangzhonnewwangzhonnew软件工程师IBM Canada Ltd.
还是那句话,可能是版本问题啦
毕竟在这4-5年里面db2的优化器也是在不断发展的,重写规则也是随着版本的更新而在变化
IT分销/经销 · 2012-04-10
浏览572

回答者

wangzhonnew
软件工程师IBM Canada Ltd.
擅长领域: 数据库

wangzhonnew 最近回答过的问题

回答状态

  • 发布时间:2012-04-10
  • 关注会员:1 人
  • 回答浏览:572
  • X社区推广