原文地址:http://www.cnblogs.com/downmoon/archive/2012/04/19/2456451.html

在《SQL Server 2012服务端使用OFFSET/FETCH NEXT实现分页》一文中,我引用了《SQL Server 2012 - Server side paging demo using OFFSET/FETCH NEXT》,原文地址。 作者在文中称,要SQL Server 2012使用OFFSET/FETCH NEXT分页,比SQL Server 2005/2008中的RowNumber()有显著改进。今天特地作了简单测试,现将过程分享如下:

附:我的测试环境为:
SQL Server 2012,命名实例

Microsoft SQL Server 2012 - 11.0.2100.60 (Intel X86)
Feb 10 2012 19:13:17
Copyright (c) Microsoft Corporation
Enterprise Edition on Windows NT 6.0 <X86> (Build 6002: Service Pack 2)

沿用上文的测试数据库和表:

  1. IF OBJECT_ID('DemoPager2012') IS NOT NULL
  2. DROP DataBase DemoPager2012
  3. GO
  4. CREATE Database DemoPager2012
  5. GO
  6. USE DemoPager2012
  7. GO
  8. /*
  9. Setup script to create the sample table and fill it with
  10. sample data.
  11. */
  12. IF OBJECT_ID('Customers','U') IS NOT NULL
  13. DROP TABLE Customers
  14.  
  15. CREATE TABLE Customers ( CustomerID INT primary key identity(1,1),
  16. CustomerNumber CHAR(4),
  17. CustomerName VARCHAR(50),
  18. CustomerCity VARCHAR(20) )
  19. GO
  20.  
  21. TRUNCATE table Customers
  22. GO
  23.  
  24. DBCC DROPCLEANBUFFERS
  25. DBCC FREEPROCCACHE
  26.  
  27. /*****运用CTE递归插入,速度较快,邀月注***********************/
  28. WITH Seq (num,CustomerNumber, CustomerName, CustomerCity) AS
  29. (SELECT 1,cast('0000'as CHAR(4)),cast('Customer 0' AS NVARCHAR(50)),cast('X-City' as NVARCHAR(20))
  30. UNION ALL
  31. SELECT num + 1,Cast(REPLACE(STR(num, 4), ' ', '0') AS CHAR(4)),
  32. cast('Customer ' + STR(num,6) AS NVARCHAR(50)),
  33. cast(CHAR(65 + (num % 26)) + '-City' AS NVARCHAR(20))
  34. FROM Seq
  35. WHERE num <= 10000
  36. )
  37. INSERT INTO Customers (CustomerNumber, CustomerName, CustomerCity)
  38. SELECT CustomerNumber, CustomerName, CustomerCity
  39. FROM Seq
  40. OPTION (MAXRECURSION 0)

插入1万条数据后,在SQL Server 2008 R2中执行Row_Number():

  1. /*
  2. Server side paging demo using ROW_NUMBER() - SQL Server
  3. 2005/2008 version.
  4. */
  5.  
  6. DBCC DROPCLEANBUFFERS
  7. DBCC FREEPROCCACHE
  8.  
  9. SET STATISTICS IO ON;
  10. SET STATISTICS TIME ON;
  11. GO
  12.  
  13. DECLARE @page INT, @size INT
  14. SELECT @page = 3, @size = 10
  15.  
  16. ;WITH cte AS (
  17. SELECT TOP (@page * @size)
  18. CustomerID,
  19. CustomerName,
  20. CustomerCity,
  21. ROW_NUMBER() OVER(ORDER BY CustomerName ) AS Seq,
  22. COUNT(*) OVER(PARTITION BY '') AS Total
  23. FROM Customers
  24. WHERE CustomerCity IN ('A-City','B-City')
  25. ORDER BY CustomerName ASC
  26. )
  27. SELECT * FROM cte
  28. WHERE seq BETWEEN (@page - 1 ) * @size + 1 AND @page * @size
  29. ORDER BY seq;
  30. GO
  31.  
  32. SET STATISTICS IO OFF ;
  33. SET STATISTICS TIME OFF;
  34. GO

SQL Server 2012中执行OFFSET/FETCH NEXT语句如下:

  1. /*
  2. Server side paging demo using the new enhancements added
  3. in SQL Server 2012
  4. */
  5. DBCC DROPCLEANBUFFERS
  6. DBCC FREEPROCCACHE
  7.  
  8. SET STATISTICS IO ON;
  9. SET STATISTICS TIME ON;
  10. GO
  11.  
  12. DECLARE @page INT, @size INT
  13. SELECT @page = 3, @size = 10
  14.  
  15. SELECT
  16. *,
  17. COUNT(*) OVER(PARTITION BY '') AS Total
  18. FROM Customers
  19. WHERE CustomerCity IN ('A-City','B-City')
  20. ORDER BY CustomerID
  21. OFFSET (@page -1) * @size ROWS
  22. FETCH NEXT @size ROWS ONLY;
  23. GO
  24.  
  25. SET STATISTICS IO OFF;
  26. SET STATISTICS TIME OFF;
  27. GO

在SQL Server 2012中执行如下语句:

  1. DBCC DROPCLEANBUFFERS
  2. DBCC FREEPROCCACHE
  3.  
  4. SET STATISTICS IO ON;
  5. SET STATISTICS TIME ON;
  6. GO
  7.  
  8. DECLARE @page INT, @size INT
  9. SELECT @page = 3, @size = 10
  10.  
  11. ;WITH cte AS (
  12. SELECT TOP (@page * @size)
  13. CustomerID,
  14. CustomerName,
  15. CustomerCity,
  16. ROW_NUMBER() OVER(ORDER BY CustomerName ) AS Seq,
  17. COUNT(*) OVER(PARTITION BY '') AS Total
  18. FROM Customers
  19. WHERE CustomerCity IN ('A-City','B-City')
  20. ORDER BY CustomerName ASC
  21. )
  22. SELECT * FROM cte
  23. WHERE seq BETWEEN (@page - 1 ) * @size + 1 AND @page * @size
  24. ORDER BY seq;
  25.  
  26. SELECT
  27. *,
  28. COUNT(*) OVER(PARTITION BY '') AS Total
  29. FROM Customers
  30. WHERE CustomerCity IN ('A-City','B-City')
  31. ORDER BY CustomerID
  32. OFFSET (@page -1) * @size ROWS
  33. FETCH NEXT @size ROWS ONLY;
  34. GO
  35.  
  36. SET STATISTICS IO OFF;
  37. SET STATISTICS TIME OFF;
  38. GO

结果:

结论:无论是从逻辑读取数还是响应时间实际执行行数等关键参数看,SQL Server 2012提供的OFFSET/FETCH NEXT分页方式都比Row_Number()方式有了较大的提升。

SQL Server 2012提供的OFFSET/FETCH NEXT与Row_Number()对比测试(转)的更多相关文章

  1. SQL Server 2012提供的OFFSET/FETCH NEXT与Row_Number()对比测试 [T]

    SQL Server 2008中SQL应用系列--目录索引 前些天看到一篇文章<SQL Server 2012 - Server side paging demo using OFFSET/FE ...

  2. 《SQL Server 2012 T-SQL基础》读书笔记 - 2.单表查询

    Chapter 2 Single-Table Queries GROUP BY之后的阶段的操作对象就是组(可以把一组想象成很多行组成的)了,HAVING负责过滤掉一些组.分组后的COUNT(*)表示每 ...

  3. SQL Server 2012 AlwaysOn集群配置指南

    1. AlwaysOn介绍 AlwaysOn是SQL Server 2012提供的全新综合.灵活.高效经济的高可用性和灾难恢复解决方案.它整合了镜像和群集的功能,基于OS 故障转移群集(Windows ...

  4. [转]SQL Server 2012 的 T-SQL 新功能 – 新的数据分析函数(LEAD、LAG)

    当您需要在 SQL Server 中利用 T-SQL 比较结果集的每一列跟前一列或后一列的差异时,在过去可能需要利用 CURSOR 搭配临时表变量,或是透过递归 CTE 来达到这个效果,如今 SQL ...

  5. Microsoft SQL Server 2012安装说明

    Microsoft SQL Server 2012安装说明 环境:Windows8, Windows7, WinVista, Win2003, WinXP Microsoft SQL Server 2 ...

  6. 《SQL Server 2012 T-SQL基础》读书笔记 - 4.子查询

    Chapter 4 Subqueries 子查询分为:独立子查询(Self-Contained Subqueries)和相关子查询(Correlated Subqueries),独立子查询可以单独拿出 ...

  7. SQL Server 2012 OFFSET/FETCH NEXT分页示例(转载)

    原文:http://beyondrelational.com/modules/29/presentations/483/scripts/12983/sql-server-2012-server-sid ...

  8. SQL Server 2012 OFFSET/FETCH NEXT分页示例

    原文:http://beyondrelational.com/modules/29/presentations/483/scripts/12983/sql-server-2012-server-sid ...

  9. Sql Server 2012 的新分页方法分析(offset and fetch) - 转载

    最近在分析 Sql Server 2012 中 offset and fetch 的新特性,发现 offset and fetch 无论语法的简洁还是功能的强大,都是相当相当不错的 其中 offset ...

随机推荐

  1. ExtJS面向对象

    序言 1.ExtJs是一套很好的后台框架.现在很流行的,我们要会. 2.这是我写ExtJs的第一篇,以后会写很多直到把这框架运用的炉火纯青,走火入魔. ExtJs中的命名空间 我是做.net的,这命名 ...

  2. 轻量级前端MVVM框架avalon - ViewModel

    废话说了大几篇,我们开始来点干货了~ ViewModel的内部机制 在MVVM中,数据是核心.而jQuery则以DOM为核心. 而DOM只是HTML在JS的世界的抽象,是一个很易变的东西.因此如果业务 ...

  3. Hibernate的数据删除,更改

    其他未给出代码,请参考上一篇.... 一.数据的删除 方法1.从“多”的一方进行数据的删除 books.hbm.xml文件不变: <many-to-one name="publishe ...

  4. 从零开始编写自己的C#框架(9)——数据库设计与创建

    对于千万级与百万级数据库设计是有所区别的,由于本项目是基于中小型软件开发框架来设计,记录量相对会比较少,所以数据库设计时考虑的角度是:与开发相结合:空间换性能:空间换开发效率:减少null异常.... ...

  5. MySQL学习笔记八:日期/时间的处理

    MySQL日期时间的处理,在其官网文档上都有详细的阐述,想了解更多的同学可自行查阅. 1.查询当前日期时间:函数有now(),localtime(),current_timestamp(),sysda ...

  6. Rust初步(四):在rust中处理时间

    这个看起来是一个很小的问题,我们如果是在.NET里面的话,很简单地可以直接使用System.DateTime.Now获取到当前时间,还可以进行各种不同的计算或者输出.但是这样一个问题,在rust里面, ...

  7. windows下compsoer的简单操作

    *****************************************[安装]***************************************** 下载地址https://g ...

  8. php对文本文件进行分页功能简单实现

    php对文本文件进行分页功能简单实现 <!DOCTYPE> <html> <head> <meta http-equiv="Content-type ...

  9. 让自己也能使用Canvas

    <canvas> 是 HTML5 新增的元素,可使用JavaScript脚本来绘制图形.例如:画图,合成照片,创建动画甚至实时视频处理与渲染. 兼容性方面,除了一些骨灰级浏览器IE6.IE ...

  10. Excel基础

    一.基础 一个Excel文档称为工作簿(workbook).一个工作簿中可以包含多个工作表(sheet) ctrl+向右箭头  查看最后一列 ctrl+向下箭头 查看最后一行 二.合并单元格 三.等高 ...