首先,不可否认,我不是 DBA ......所以我的 SQL-fu 很弱。
我最近在做一个项目,该项目有一个相当大的报告,它做了 10 个内部连接。当使用 SQL Studio 管理客户端对 Prod 数据 (SQL Server 2005) 运行时,查询不是一个谷仓燃烧器,但它在不到 20 秒内返回。但是,当通过 Spring 时,31 分钟。
因此,我们得到了 DBA 忍者,他指出查询计划会有所不同,因为 JDBC 方法将使用准备好的语句,将变量作为参数传递,而在客户端中,这些是硬编码的。因此,他重新处理了查询。
生成的查询现在在顶部设置了一些声明变量,然后使用这些变量创建本地临时表,然后使用本地临时表作为最终报告查询的一部分。他说我们应该能够将所有这些作为同一查询字符串的一部分发送(复合查询????)。它看起来像这样(混淆以保护无辜者):
declare @startdate DateTime
declare @enddate DateTime
set @startdate = DATEADD (dd, 0, DATEDIFF (dd, 0, '2013-03-01 00:00:00.000'))
set @enddate = DATEADD (dd, 1, DATEDIFF (dd, 0, '2013-08-08 00:00:00.000'))
CREATE TABLE #LATEST_BLAH_ACTION
(
FK_Blah_Timestamp DATETIME,
FK_Blah_Id VARCHAR(10),
Blah_Other_Thing VARCHAR(10),
[Latest Updated Date/Time] DATETIME
)
INSERT INTO #LATEST_BLAH_ACTION
SELECT FK_Blah_Timestamp, FK_Blah_Id, Blah_Other_Thing,
MAX(Blah_Other_Timestamp) AS [Latest Updated Date/Time]
FROM BlahTable
WHERE Blah_Another_Thing = 'Some value' AND
Blah_Other_Timestamp BETWEEN @startdate and @enddate
GROUP BY FK_Blah_Timestamp, FK_Blah_Id, Blah_Other_Thing
SELECT
-- Bunch of fields
From LATEST_BLAH_ACTION
-- Bunch of crazy Inner Joins and such
但是它不起作用。如果我在 SQL Management Studio 中运行它,我会得到结果。如果我使用 Spring 的 SimpleJdbcTemplate 从 Java 代码中运行它,则没有错误但没有结果。
是否可以使用 Spring 运行这样的(复合???)查询,如果可以,如何?我是否必须单独进行,但作为交易的一部分?也许使用 SimpleJdbcTemplate 以外的东西?