Microsoft SQL Server:错误的查询执行计划耗时太长

时间:2017-04-07 01:15:46

标签: sql-server sql-server-2008

这是在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,D​​010014)

重新索引并重建/更新两个表中完成的统计数据,但问题未解决(D009021,D​​010014)

如果我们减少分支数量但是慢慢地

,同样的查询正在工作
  (
    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分钟内输出

我尝试清理缓存查询执行计划并优化新计划但问题仍然存在

发现查询估算计划和实际执行计划不同(见截图)

working plan long waiting plan

1 个答案:

答案 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