SQL Server下7种“数据分页”方案全网最新最全

SQL Server下7种“数据分页”方案全网最新最全攻略

数据分页是应用程序中十分重要的功能之一,它可以提高数据处理效率,减轻服务器负担,从而保证用户体验。SQL Server提供了多种数据分页方案,本文将描述其中7种最常用的方案,以及它们的使用场景和优缺点。

常规分页

实现方式

常规分页是最简单常用的分页方式,其实现方式为:

SELECT *
FROM  (SELECT ROW_NUMBER() OVER (ORDER BY id DESC) AS RowNumber, *
       FROM   MyTable) AS TempTable
WHERE  RowNumber BETWEEN 1 AND 10

其中,ROW_NUMBER() OVER (ORDER BY id DESC)用于对数据集进行排序并为每一行添加一个数值,用来记录行号。TempTable是一个子查询,其结果是添加了行号的数据集。最后,在TempTable基础上进行分页操作。

使用场景

常规分页适用于数据量较小,且对分页速度没有很高要求的场景。它是一种可靠且易于实现的分页方案,可以满足大部分需求。

优缺点

常规分页的优点是实现简单,易于理解;缺点是随着数据量的增加,查询效率会逐渐降低,可能导致性能瓶颈。

基于OFFSET/FETCH的分页

实现方式

OFFSET/FETCH分页是SQL Server 2012及以上版本提供的分页方式,其实现方式为:

SELECT *
FROM   MyTable
ORDER BY id DESC
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

其中,OFFSET子句定义了起始行号,FETCH NEXT子句定义了每页返回的行数。

使用场景

OFFSET/FETCH分页适用于数据量较大,且需要快速分页的场景。它比常规分页效率更高,能够提高数据读取速度,降低CPU占用率。

优缺点

OFFSET/FETCH分页的优点是效率高,易于维护;缺点是只能用于SQL Server 2012及以上版本,不兼容更早版本的数据库。

基于TOP和NOT IN的分页

实现方式

基于TOP和NOT IN的分页是一种比较特殊的分页方式,其实现方式为:

SELECT TOP 10 *
FROM   MyTable
WHERE  id NOT IN (SELECT TOP 20 id FROM MyTable ORDER BY id DESC )
ORDER BY id DESC

其中,第一条SELECT语句用于返回指定数量的结果,第二条SELECT语句用于排除前面页数的数据,ORDER BY子句用于对数据进行降序排序。

使用场景

基于TOP和NOT IN的分页适用于数据量较小,且对查询速度要求较高的场景,具有一定的容错性。

优缺点

基于TOP和NOT IN的分页的优点是效率较高,实现简单;缺点是不能适用于数据量非常大的场景,而且如果MyTable中的id列没有索引,查询效率可能较低。

基于ROW_NUMBER和子查询的分页

实现方式

基于ROW_NUMBER和子查询的分页是一种能够处理大数据量的分页方式,其实现方式为:

SELECT  *
FROM    ( SELECT ROW_NUMBER() OVER ( ORDER BY id DESC ) AS RowNum, *
           FROM    MyTable
         ) AS TempTable
WHERE   RowNum BETWEEN 1 AND 10
ORDER BY id DESC

其中,ROW_NUMBER函数用于为数据集中的每条记录添加行号,子查询用于处理行号分页后的结果集。最后,在此结果集上再次进行排序。

使用场景

基于ROW_NUMBER和子查询的分页适用于数据量较大的场景,能够提高查询效率。

优缺点

基于ROW_NUMBER和子查询的分页的优点是适用于处理大数据量,而且查询效率较高;缺点是代码可读性较差,易产生歧义。

基于FETCH与OFFSET的OFFSET AND FETCH NEXT分页

实现方式

基于FETCH与OFFSET的OFFSET AND FETCH NEXT分页是一个完整的OFFSET FETCH SQL Server 版本,即适用于SQL Server 2012以及以上版本,其实现方式为:

SELECT *
FROM   MyTable
ORDER BY id DESC
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;

在 OFFSET FETCH 中的关键字是FETCH 和 OFFSET,在该查询的情况下,将榜单中的前10个列表显示给用户浏览。

使用场景

基于FETCH与OFFSET的OFFSET AND FETCH NEXT分页适用于任何浏览你的榜单的用户,简单易用

优缺点

基于FETCH与OFFSET的OFFSET AND FETCH NEXT分页的优点是它是最好的分页方法,因为它通过合并 FETCH 和 OFFSET 语句来提高访问飞快的速度,而且其代码风格既简单易懂,又将数据分组呈现,可自如快速掌握;缺点则是只适用于SQL Server 2012及以上版本。

基于递归CTE分页

实现方式

递归CTE分页是一种比较复杂的分页方式,其实现方式为:

WITH PagingCTE AS
(
  SELECT *, ROW_NUMBER() OVER (ORDER BY id DESC) AS RowNum
  FROM MyTable
),
CTE AS
(
  SELECT *, COUNT(*) OVER() AS TotalRows
  FROM PagingCTE
  WHERE RowNum BETWEEN 1 AND 10
  UNION ALL
  SELECT *, TotalRows
  FROM CTE
  WHERE RowNum BETWEEN 1 AND 10
)
SELECT *
FROM CTE
WHERE RowNum BETWEEN 1 AND 10
ORDER BY id DESC
OPTION (MAXRECURSION 0)

其中,分页查询首先用一条普通的SELECT语句将要分页的数据集包裹起来并添加行号,接着使用CTE(公共表表达式)将分页后的数据,再经过联合 WHERE 子句过滤器进行递归返回结果集。

使用场景

递归CTE分页适用于需要对比多层数据进行分页操作的场景,具有较高的灵活性。

优缺点

递归CTE分页的优点是对于任意的分页数据集都适用,具有较高的灵活性;缺点是实现相对复杂,执行效率较低。

基于动态分页的存储过程

实现方式

基于动态分页的存储过程是一种将分页处理逻辑封装在存储过程中的方式,具有较高的可维护性,其实现方式为:

CREATE PROCEDURE MyPagination
   @PageNumber INT,
   @PageSize INT
AS 
BEGIN 
    DECLARE @Skip INT, @Top INT 
    SET @Skip = (@PageNumber - 1) * @PageSize 
    SET @Top = @PageSize 

    DECLARE @SQL NVARCHAR(MAX) = N'
        SELECT *
        FROM 
            (SELECT ROW_NUMBER() OVER (ORDER BY id DESC) AS RowNumber, *
             FROM MyTable) AS TempTable
         WHERE TempTable.RowNumber BETWEEN ' + CAST(@Skip AS NVARCHAR(MAX)) + ' AND ' + CAST(@Skip + @Top AS NVARCHAR(MAX))

    EXEC(@SQL)
END

在存储过程中,通过定义输入参数PageNumber和PageSize来指定当前页数和每页显示数据的数量,使用DECLARE语句定义了Skip和Top变量,使用一条包含变量的SELECT语句来查询适合当前分页条件的数据。

使用场景

基于动态分页的存储过程适用于需要动态调整分页显示的需求,具有较高的可维护性和扩展性。

优缺点

基于动态分页的存储过程的优点是维护和修改容易,代码更加简洁明了;缺点是存储过程使用复杂,可能会增加数据库负载。

结论

SQL Server提供了多种数据分页方案,不同的分页方案适用于不同的数据量和查询需求。在实际开发中,应该根据数据量大小和查询效率要求来选择合适的分页方案。例如,常规分页方式可以实现简单的分页显示,但当数据量变大时,效率将会受到一定的影响。而基于OFFSET/FETCH的分页由于不需要进行子查询,所以相对执行速度更快,其使用起来也更加灵活。

综上所述,在SQL Server中,选择合适的数据分页方案,可以提高数据处理效率,减轻服务器负担,从而保证用户体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SQL Server下7种“数据分页”方案全网最新最全 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • 分享3个MySQL查询容易踩的坑

    当你在使用MySQL时,可能会遇到一些困扰,以下是三个容易踩坑的MySQL查询: 1. 对空字符串进行匹配 在执行MySQL查询时,通常我们使用如下语法: SELECT * FROM table WHERE column = ‘value’; 然而,当column列中存储的数据内容为空字符串时,则需要使用不同的查询语法: SELECT * FROM tabl…

    database 2023年5月22日
    00
  • 详解MySQL日期和时间类型的使用方法

    MySQL支持多种日期和时间类型,每种类型都适用于不同的情境。下面是MySQL支持的日期和时间类型: DATE:日期类型,格式为YYYY-MM-DD。它用于存储日期信息,例如出生日期、应收账单日期等。 TIME:时间类型,格式为HH:MM:SS。它用于存储时刻信息,例如开门时间、开机时间等。 DATETIME:日期时间类型,格式为YYYY-MM-DD HH:…

    MySQL 2023年3月9日
    00
  • SQL Server不存在或访问被拒绝问题的解决第1/3页

    本文旨在解决SQL Server不存在或访问被拒绝的问题。 问题概述 当我们尝试连接SQL Server时,有时会遇到”SQL Server不存在或访问被拒绝”的错误提示,这时我们需要先查找问题的根源并采取相应的解决措施。 问题解决步骤 验证SQL Server是否正在运行 若SQL Server已关闭,无法连接该服务器。 若要启动SQL Server,请在…

    database 2023年5月21日
    00
  • MYSQL 运算符总结

    MYSQL 运算符总结 MySQL 运算符主要包括算术运算符、比较运算符、逻辑运算符等。 算术运算符 算术运算符用于基本的数学运算,包括加、减、乘、除、求余等操作。其中,取余操作可以用于判断一个数是否是偶数或奇数等应用场景。 示例 SELECT 5 + 3; — 输出 8 SELECT 10 – 2; — 输出 8 SELECT 6 * 4; — 输出…

    database 2023年5月22日
    00
  • 为什么在MySQL中不建议使用UTF-8

    为什么在MySQL中不建议使用UTF-8? 在MySQL的过去版本中,UTF-8被实现为最多需要3个字节来存储一个字符。然而,UTF-8的标准规范允许每个字符最多使用4个字节的存储空间。由于MySQL的实现方式是固定为最多使用3个字节存储一个字符,这意味着当存储需要4字节的字符时,MySQL会强制使用2个UTF-8字符来存储该字符,这被称为“UTF-8代理对…

    database 2023年5月22日
    00
  • Linux安装PHP MongoDB驱动

    下面是Linux安装PHP MongoDB驱动的完整攻略: 步骤一:安装pecl工具 sudo apt install php-pear 步骤二:安装MongoDB驱动 sudo pecl install mongodb 步骤三:修改PHP配置文件 在/etc/php/7.x/cli/conf.d目录下新建20-mongodb.ini文件(注意7.x应该写入…

    database 2023年5月22日
    00
  • DBMS中游标和触发器的区别

    接下来我将详细解释DBMS中游标和触发器的区别。 游标和触发器的定义 游标和触发器都是DBMS中的重要概念,但它们的含义却不同。 游标:是在SQL语句执行中,对于一组数据结果的读取,可以将其理解为指针,指向关系数据库系统的某行,并允许程序对该行执行操作。因此,游标是一种用于遍历结果集的高级机制,可以理解为一个指向表格中数据行的指针。 触发器:是一段存储在关系…

    database 2023年3月27日
    00
  • redis集群搭建及一些问题

      redis     (本套Redis集群为简化版安装部署,只需解压至普通用户家目录下或者任意目录,解压后修改脚本,执行脚本后即可使用。)     注意,此版本需要在redis配置文件中添加 protected-mode no,确认添加完成后再启动服务。 1、单机部署 1.新建普通用户,将压缩包解压到家目录下。 tar zxf rediscluster.t…

    Redis 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部