【发布时间】:2018-03-07 14:22:48
【问题描述】:
我有一个 SQL Server 数据库视图,它有很多内连接操作。此视图在执行选择操作时完美运行。它不是很快,但在合理范围内。
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
这非常快。
有没有办法在不使用临时表解决方案的情况下更快地对我的视图数据进行排序?所以要强制查询首先进行选择,然后进行排序。
【问题讨论】:
-
您可以发布代码以供您查看吗?以及它背后的表的定义,以及它们的索引?
-
你有
CompanyName的索引吗?如果不是,那么它很慢的原因是因为 SQL Server 必须检查每一行,并相应地对其进行排序。 @SeanLange 在 DDL 请求中击败了我。 :) -
慢查询和快查询的执行计划有什么区别?
-
作为早上第一件事的猜测,添加 ORDER BY 会强制 Sql Server 持有一些锁的时间更长,从而产生争用,并在内存中维护整个结果集。但是我还没有喝完咖啡,所以我不会尝试修复它的建议,只是说与您的 ORDER BY 中的列匹配的索引可能会有所帮助。
-
我真的认为视图的查询需要优化,在临时表上会更快是有道理的,因为SQL Server对查询所做的临时表基本上只是通过where子句过滤并对其进行排序,但是在整个视图中,sql server 基本上会执行并检查基础表(您的视图查询),然后通过 where 子句对其进行过滤,然后对其进行排序。花了更长的时间
标签: sql sql-server view query-optimization