加入因 WHERE 条件而减慢

Join slowed by WHERE condition

我们的一个观点,通常很快,从昨天中午开始就花了很长时间 运行。什么都没有改变,但现在需要几分钟才能到达 运行。

SELECT 
    T1.ITEMNO,
    ROUND(SUM(T3.TOTAL * V1.USDCOST), 3) USDTOTALCOST,
    ROUND(SUM(T3.TOTAL * V1.GBPCOST), 3) GBPTOTALCOST,
    SUM(T3.TOTAL) AS TOTALCOMPONENTS
FROM
    TABLE1 T1 WITH (NOLOCK)
    INNER JOIN TABLE2 T2 WITH (NOLOCK) ON T1.RECORD_ID = T2.RECORD_ID
    INNER JOIN TABLE3 T3 WITH (NOLOCK) ON T1.RECORD_ID = T3.RECORD_ID AND T2.LINENO = T3.LINENO
    INNER JOIN VIEW1 V1 ON T2.COMPONENTNO = V1.ITEMNO
WHERE
    T2.COMPONENTNO <> '' AND T1.WINDOW_ID = 'COMPONENTS'
GROUP BY T1.ITEMNO

现在,如果我删除计算的 USDTOTALCOSTGBPTOTALCOST 列,那么查询 运行 会非常快。另外,如果我删除条件 T1.WINDOW_ID = 'COMPONENTS' 那么这也会大大提高查询速度。

VIEW1 运行 本身也很快,它似乎只是导致此视图在加入时变慢并且未施加 T1.WINDOW_ID = 'COMPONENTS' 条件.

我被卡住了 - 我不再知道去哪里检查以尝试在合理的时间内获得此查询 运行ning。我通常会在执行计划的顶部检查 SSMS 建议我创建哪些索引,但是当我检查此查询的执行计划时没有这样的建议。

是什么导致查询速度如此之慢?我能做些什么来尝试让它再次工作?

提前致谢。

  1. 如果有可能在视图上创建索引并在查询中使用 with(noexpand) 提示。这将提高您的观看效果。

  2. 使用 T1.WINDOW_ID = 'COMPONENTS'

  3. 在 Table1 上创建过滤器索引

我按照执行计划设法解决了这个问题,发现 Hash Match 占 20%,Index Scan 占 14%。

我在正在扫描索引的 table 上创建了一个索引,查询立即加快了速度。

CREATE NONCLUSTERED INDEX IND_POPRECORD ON POP30310(PORCTNM)