DB2 JDBC实现是否存在子选择优化问题?

时间:2014-03-31 15:17:31

标签: sql jdbc db2 websphere

?我们有一个使用JDBC和DB2 Universal JDBC Driver(v9.7)运行查询的Web应用程序 通过应用程序运行时,查询至少需要2分钟才能完成。 但是,在命令行中,相同的查询只需要两秒钟。我们无法弄清问题所在。

WebSphere AppServer位于WebSEAL代理服务器后面,该服务器的超时时间为2分钟,因此当应用程序响应时间超过2分钟时,用户会看到错误。用户刚刚报告了该问题,但最近没有进行任何更改。我怀疑查询响应时间已逐渐增长,最终达到WebSEAL超时。

查询在WHERE子句中有一个子选择(只需要运行一次),我想知道在通过JDBC时是否没有优化该子选择,导致它与每一行重新运行加入了表格。

查询是:

SELECT A.VOIDED, A. DELIVERY_DATE_TEXT, A.TRANSACTION_ID, A.AIRBILL_NUMBER, A.NAME, B.DOCUMENT_NUMBER, B.STATUS 
FROM SHIPPING A, TRANSACTION B 
WHERE A.TRANSACTION_ID = B.TRANSACTION_ID 
  AND A.ORIGINAL_REQUEST_TIME < 
     (SELECT ORIGINAL_REQUEST_TIME FROM SHIPPING WHERE AIRBILL_NUMBER = ?) 
  AND B.STATUS <> 4 
  AND A.VOIDED IS NULL

TRANSACTION表中有180万条记录,SHIPPING表有95000条。

查询有问题吗?它在CLI上工作正常 或者DB2 JDBC驱动程序中是否存在错误?


更新

好吧,我们尝试了一个带有直接连接(而不是连接池)的命令行测试程序(没有Websphere),没有Spring JDBC包装器对象(我们在应用程序中使用),问题不可能是重新创建。

然后我们使用db2expln来检查带有和不带参数的查询的查询计划,它们都是相同的。

最后,我们开始在生产表上尝试 runstats ,这有所不同。应用程序查询现在返回几秒钟。它帮助的事实出人意料。我们最初没有这样做,因为CL查询速度如此之快。

所以我猜问题是已解决。但我们仍然不知道为什么Websphere JDBC查询最初比命令行查询(以及非Websphere JDBC查询)慢得多。

1 个答案:

答案 0 :(得分:1)

几乎可以肯定,这种情况的不同之处在于提交的JDBC查询使用的是参数标记,而在命令行上运行的查询则显式显示了所有值。

使用显式值,DB2可以利用分布统计信息来编译查询,这可能会导致更有效的查询计划。正如@mustaccio建议的那样,您应该比较查询的两个变体之间的查询计划,以查看DB2在它们之间做出的不同。