为什么在视图上使用ORDER BY语句的TOP比检索所有数据要慢?

时间:2015-09-02 14:42:12

标签: sql sql-server view

我们有一个非常复杂的视图(未编入索引),其中包含许多统计数据的计算属性。此视图也引用了其他一些索引视图。

在这个视图中,我们希望实现一个具有分页和排序支持的GUI,并在排序DESC时观察到一些非常奇怪的行为。

当页码增加时,使用ROW_NUMBER分页支持非常缓慢(甚至超时)。所以我们搜索了一个替代方案。

v.ID 是其中一个带ASC排序的引用表的主键。

慢: 35秒

SELECT TOP(100) v.* FROM View AS v WHERE v.ID > 100 AND v.bar != 0 ORDER BY v.foo DESC;

'快速:' 4秒

SELECT v.* FROM View AS v WHERE v.ID > 100 AND v.bar != 0 ORDER BY v.foo DESC;

我们使用SQL Server 2008。

在这种情况下,如果没有提供排序,TOP语句只会很快。

排序是否对顶部有影响?

1 个答案:

答案 0 :(得分:-1)

那是因为在sql server中,TOP是按顺序计算的。在像oracle这样的其他rdbms中(而不是顶部X使用rownum< = X)它在订单之前计算,因此您必须使用子查询。可能sql server在里面做了类似的事情,你应该在执行计划中看到它

编辑: 我不明白为什么这只是投票...

https://msdn.microsoft.com/en-us/library/ms189463(v=sql.105).aspx

  

如果查询包含ORDER BY子句,则返回ORDER BY子句排序的第一个表达式行或表达式百分比行。如果查询没有ORDER BY子句,则行的顺序是任意的。

为了选择有序的前100名,首先必须先订购,然后选择前100名。因为它没有编入索引,必须先订购整个表格,然后选择顶部