加入因 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
现在,如果我删除计算的 USDTOTALCOST
和 GBPTOTALCOST
列,那么查询 运行 会非常快。另外,如果我删除条件 T1.WINDOW_ID = 'COMPONENTS'
那么这也会大大提高查询速度。
VIEW1
运行 本身也很快,它似乎只是导致此视图在加入时变慢并且未施加 T1.WINDOW_ID = 'COMPONENTS'
条件.
我被卡住了 - 我不再知道去哪里检查以尝试在合理的时间内获得此查询 运行ning。我通常会在执行计划的顶部检查 SSMS 建议我创建哪些索引,但是当我检查此查询的执行计划时没有这样的建议。
是什么导致查询速度如此之慢?我能做些什么来尝试让它再次工作?
提前致谢。
如果有可能在视图上创建索引并在查询中使用 with(noexpand) 提示。这将提高您的观看效果。
使用 T1.WINDOW_ID = 'COMPONENTS'
在 Table1 上创建过滤器索引
我按照执行计划设法解决了这个问题,发现 Hash Match
占 20%,Index Scan
占 14%。
我在正在扫描索引的 table 上创建了一个索引,查询立即加快了速度。
CREATE NONCLUSTERED INDEX IND_POPRECORD ON POP30310(PORCTNM)
我们的一个观点,通常很快,从昨天中午开始就花了很长时间 运行。什么都没有改变,但现在需要几分钟才能到达 运行。
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
现在,如果我删除计算的 USDTOTALCOST
和 GBPTOTALCOST
列,那么查询 运行 会非常快。另外,如果我删除条件 T1.WINDOW_ID = 'COMPONENTS'
那么这也会大大提高查询速度。
VIEW1
运行 本身也很快,它似乎只是导致此视图在加入时变慢并且未施加 T1.WINDOW_ID = 'COMPONENTS'
条件.
我被卡住了 - 我不再知道去哪里检查以尝试在合理的时间内获得此查询 运行ning。我通常会在执行计划的顶部检查 SSMS 建议我创建哪些索引,但是当我检查此查询的执行计划时没有这样的建议。
是什么导致查询速度如此之慢?我能做些什么来尝试让它再次工作?
提前致谢。
如果有可能在视图上创建索引并在查询中使用 with(noexpand) 提示。这将提高您的观看效果。
使用 T1.WINDOW_ID = 'COMPONENTS'
在 Table1 上创建过滤器索引
我按照执行计划设法解决了这个问题,发现 Hash Match
占 20%,Index Scan
占 14%。
我在正在扫描索引的 table 上创建了一个索引,查询立即加快了速度。
CREATE NONCLUSTERED INDEX IND_POPRECORD ON POP30310(PORCTNM)