【发布时间】: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
现在,如果我删除计算出的 USDTOTALCOST 和 GBPTOTALCOST 列,那么查询运行得非常快。另外,如果我删除条件T1.WINDOW_ID = 'COMPONENTS',那么这也会大大提高查询速度。
VIEW1 自己运行也非常快,它似乎只是导致这个视图在加入时变慢并且没有施加T1.WINDOW_ID = 'COMPONENTS' 条件。
我被卡住了 - 我不再知道在哪里检查以尝试在合理的时间内运行此查询。我通常会检查 SSMS 建议我在执行计划的顶部创建哪些索引,但是当我检查此查询的执行计划时没有这样的建议。
是什么导致查询速度如此缓慢?我能做些什么来尝试让它再次工作?
提前致谢。
【问题讨论】:
-
您可能需要创建一些索引...重新运行您的查询并选择“包括实际执行计划”选项并查看它“遭受”的位置
-
您必须在我编辑问题之前发表评论:)。我已经运行了执行计划,但没有新索引的建议。
-
一共有多少行?您可能已达到服务器的内存限制 - 它可能正在交换到磁盘,因此会出现性能问题(以及看似任何更改都会极大影响性能的事实)。
-
查询只返回6263行,我们的sql server有64GB内存
-
您是否明确地重新编译了视图和查询?
标签: sql sql-server performance indexing database-performance