我们有一个非常复杂的视图(未编入索引),其中包含许多统计数据的计算属性。此视图也引用了其他一些索引视图。
在这个视图中,我们希望实现一个具有分页和排序支持的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
语句只会很快。
排序是否对顶部有影响?
答案 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名。因为它没有编入索引,必须先订购整个表格,然后选择顶部