Sql server排序视图结果很慢

时间:2018-03-07 14:22:49

标签: sql sql-server view query-optimization

我有一个SQL服务器数据库视图,它有很多内连接操作。执行选择操作时,此视图非常有效。它不是很快,但在合理范围内。

SELECT * FROM ViewName WHERE ItemId=1234

但是,在对此视图的结果进行排序时,性能会下降到不可接受的低点。

SELECT * FROM ViewName WHERE ItemId=1234 ORDER BY CompanyName

这看起来有点奇怪,因为我在临时表上运行相同的查询

SELECT * FROM ViewName INTO #temp WHERE ItemId=1234

SELECT * FROM #temp ORDER BY CompanyName

这非常快。

有没有办法在不使用临时表解决方案的情况下更快地对视图数据进行排序?所以要强制查询首先进行选择,然后进行排序。

1 个答案:

答案 0 :(得分:0)

您可以尝试一些变体,有时可以提供更好的性能。关键是在使用和不使用ORDER BY运行查询时查看执行计划,看看有什么不同。

一种选择是使用子查询作为派生表:

SELECT * 
FROM (
    SELECT * 
    FROM ViewName 
    WHERE ItemId=1234
) AS dt
ORDER BY CompanyName

另一种选择是使用公共表表达式,如果可能的话,我总是喜欢派生表,因为它们更具可读性:

WITH cte AS (
    SELECT * 
    FROM ViewName 
    WHERE ItemId=1234
)
SELECT * 
FROM cte 
ORDER BY CompanyName

第三种选择是使用索引提示,强制它使用正确的索引。我总是尽量避免使用此选项,因为如果数据或结构发生变化,将来可能会导致问题。您可以在此处阅读有关索引提示的更多意见:

https://www.brentozar.com/archive/2013/10/index-hints-helpful-or-harmful/