在公司业务中的一个用户表达到将近800万条数据,系统后台管理系统有个用户模块做分页处理便于运营查看。但是如果你点到很后面或者最后的页数,你会发现系统执行的很慢,让人难以接受。
打开这个功能的使用的存储过程,做了简单的处理核心代码如下
|
|
可以发现这种写法,当开始行数达到700万行的时候执行时间为
执行一次分页是4秒多,显现这是很慢的。
我们换一种写法,用sqlserver Set Rowcount方法,代码如下:
执行时间大概是1.6秒左右,这个分页的方式性能比上一种提高了将近三倍
为什么第二种方法执行性能比第一种好呢?因为用Set Rowcount 在返回指定的行数之后就停止处理查询了。而用with t as()的方法需要先查询整个结果集,在去处理分页,所以时间上会消耗比较多。
SET ROWCOUNT 的用法
使 Microsoft® SQL Server™ 在返回指定的行数之后停止处理查询。
语法
SET ROWCOUNT { number | @number_var }
参数
number | @number_var
是在停止给定查询之前要处理的行数(整数)。
注释
建议将当前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 语句重新编写为使用 TOP 语法。有关更多信息,请参见 DELETE、INSERT 或 UPDATE。
对于在远程表和本地及远程分区视图上执行的 INSERT、UPDATE 和 DELETE 语句,忽略 SET ROWCOUNT 选项设置。
若要关闭该选项(以便返回所有的行),请将 SET ROWCOUNT 指定为 0。
说明 设置 SET ROWCOUNT 选项将使大多数 Transact-SQL 语句在已受指定数目的行影响后停止处理。这包括触发器和 INSERT、UPDATE 及 DELETE 等数据修改语句。ROWCOUNT 选项对动态游标无效,但限制键集的行集和不感知游标。使用该选项时应谨慎,它主要与 SELECT 语句一起使用。