SQL Server 2005之后,令人困扰的分页问题似乎有了进展,那就是用ROW_NUMBER(),典型的语句如下SELECT *
FROM
(
SELECT *,ROW_NUMBER() OVER (ORDER BY XXX) AS RowNo
FROM tbl
) AS A
WHERE RowNo >= 11 and RowNo <= 20;
但这里忽略了一个重要的问题,那就是中间那个SELECT语句,实际上相当于做了一个SELECT *,虽然没在结果集看到,但没看到不表示数据库没做。
为什么看起来查询很快,其实是因为后面的RowNo的范围,网上流传的示例RowNo都较小,所以看不出问题,在上例中,SQL Server发现后面的条件之后,中间的SELECT被作了类似TOP 20的处理,也就是只取了20行,所以查询非常快。但把RowNo的查询范围改为10000000到1000010之后,则相当于先TOP 10万行,这时速度就明显慢下来了。
所以说,这个表达式的本质只是先TOP X,再选出X-y,X这个小范围的行,相比以前并没有什么进步。
本文探讨了使用SQL Server 2005中的ROW_NUMBER()函数进行分页的问题。虽然该方法看似解决了分页效率问题,但实际上它仅实现了先TOP X行再从中选择小范围行的操作,并未真正优化性能。当查询范围增大时,性能下降明显。
716

被折叠的 条评论
为什么被折叠?



