这是在Windows SQL Server群集上。
查询来自第三方应用程序,因此我无法永久修改查询。
查询是:
DECLARE @FromBrCode INT = 1001
DECLARE @ToBrCode INT = 1637
DECLARE @Cdate DATE = '31-mar-2017'
SELECT
a.PrdCd, a.Name, SUM(b.Balance4) as Balance
FROM
D009021 a, D010014 b
WHERE
a.PrdCd = LTRIM(RTRIM(SUBSTRING(b.PrdAcctId, 1, 8)))
AND substring(b.PrdAcctId, 9, 24) = '000000000000000000000000'
AND a.LBrCode = b.LBrCode
AND a.LBrCode BETWEEN @FromBrCode AND @ToBrCode
AND b.CblDate = (SELECT MAX(c.CblDate)
FROM D010014 c
WHERE c.PrdAcctId = b.PrdAcctId
AND c.LBrCode = b.LBrCode
AND c.CblDate <= @Cdate)
GROUP BY
a.PrdCd, a.Name
HAVING
SUM(b.Balance4) <> 0
ORDER BY
a.PrdCd
此特定查询花费了太多时间来完成执行。在不同的SQL Server上也会出现同样的问题。
在查询运行时,未找到表锁,处理器和内存使用情况正常。
正常“选择前1000”工作并在两个表中立即显示输出(D009021,D010014)
重新索引并重建/更新两个表中完成的统计数据,但问题未解决(D009021,D010014)
如果我们减少分支数量但是慢慢地
,同样的查询正在工作 (
DECLARE @FromBrCode INT =1001
DECLARE @ToBrCode INT =1001
)
如果我们替换任何一个变量并直接使用该值,同样的查询在2分钟内更快地提供输出
AND a.LBrCode BETWEEN @FromBrCode AND @ToBrCode
更改为
AND a.LBrCode BETWEEN 1001 AND @ToBrCode
如果我们在结尾添加“OPTION(RECOMPILE)”,同样的查询工作速度更快,并在2分钟内输出
我尝试清理缓存查询执行计划并优化新计划但问题仍然存在
发现查询估算计划和实际执行计划不同(见截图)
答案 0 :(得分:0)
表D010014作为b一次别名两次,一次作为c 他们加入了同一张桌子。 尝试删除下面的子查询并创建要存储的临时表 你需要的价值观。我将*添加到你自己加入的字段
SELECT MAX(c.CblDate) 来自D010014 c WHERE c.PrdAcctId = b.PrdAcctId AND c.LBrCode = b.LBrCode AND c.CblDate&lt; = @Cdate
如果你不能这样做,那就试试
SELECT TOP 1 c.CblDate
FROM D010014 c
WHERE c.PrdAcctId = b.PrdAcctId
AND c.LBrCode = b.LBrCode
AND c.CblDate <= @Cdate
ORDER BY c.CblDate DESC