【问题标题】:Join slowed by WHERE condition加入因 WHERE 条件而变慢
【发布时间】:2017-02-28 11:18:09
【问题描述】:

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

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 建议我在执行计划的顶部创建哪些索引,但是当我检查此查询的执行计划时没有这样的建议。

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

提前致谢。

【问题讨论】:

  • 您可能需要创建一些索引...重新运行您的查询并选择“包括实际执行计划”选项并查看它“遭受”的位置
  • 您必须在我编辑问题之前发表评论:)。我已经运行了执行计划,但没有新索引的建议。
  • 一共有多少行?您可能已达到服务器的内存限制 - 它可能正在交换到磁盘,因此会出现性能问题(以及看似任何更改都会极大影响性能的事实)。
  • 查询只返回6263行,我们的sql server有64GB内存
  • 您是否明确地重新编译了视图和查询?

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


【解决方案1】:

我已经通过遵循执行计划并看到 Hash Match 占 20% 和 Index Scan 占 14% 设法解决了这个问题。

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

CREATE NONCLUSTERED INDEX IND_POPRECORD ON POP30310(PORCTNM)

【讨论】:

  • “遵循执行计划”,您使用哪个软件来创建该图表以及您是如何计算百分比的?
  • “遵循执行计划”,您使用哪个软件来创建该图表以及您是如何计算百分比的?
  • 这是SQL Server Management Studio 2008生成的执行计划
【解决方案2】:
  1. 如果可能的话,在视图上创建索引并在查询中使用 with(noexpand) 提示。这将提高您的视图性能。

  2. 在 Table1 上使用 T1.WINDOW_ID = 'COMPONENTS' 创建一个过滤器索引

【讨论】:

    猜你喜欢
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2012-03-25
    • 2014-03-29
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多