加入由WHERE条件减慢

时间:2017-02-28 11:18:10

标签: sql sql-server performance indexing database-performance

我们的一个观点,通常很快,从昨天中午开始需要很长时间。没有任何改变,但它现在需要几分钟才能运行。

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'条件不会强制执行。

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

什么可能导致查询减慢这么多?我该怎么办才能让它再次运作?

提前致谢。

2 个答案:

答案 0 :(得分:3)

我已设法通过执行计划来解决此问题,并确保Hash Match占20%,Index Scan占14%。

enter image description here

我在正在扫描索引的表上创建了一个索引,并且查询立即加速。

CREATE NONCLUSTERED INDEX IND_POPRECORD ON POP30310(PORCTNM)

答案 1 :(得分:0)

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

  2. 使用T1.WINDOW_ID =&#39; COMPONENTS&#39;

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