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日

相关文章

  • SQL Server存储过程中编写事务处理的方法小结

    下面是SQL Server存储过程中编写事务处理的方法小结的详细攻略: 什么是SQL Server存储过程事务处理? SQL Server存储过程事务处理是针对一组数据库操作的完整性和安全性的定义,可以确保一组相关的操作全部完成或全部取消。例如,当向数据库中插入多个相关记录时,可能需要保证所有记录均插入成功,或者全部取消。 为什么要使用SQL Server存…

    database 2023年5月21日
    00
  • MongoDB正则表达式使用方法全攻略

    MongoDB正则表达式概述 正则表达式是用来匹配字符串的一种方式。在 MongoDB 中,正则表达式可以用来做字符串的匹配查询。 在 MongoDB 中,正则表达式的语法跟 Javascript 中的正则表达式语法基本相同,它们都是采用斜杠(/)包围正则表达式模式,并用可选的标记来修饰模式。 下面是 MongoDB 正则表达式的语法: /pattern/m…

    MongoDB 2023年3月14日
    00
  • 细说MySQL死锁与日志二三事

    细说MySQL死锁与日志二三事 死锁 概念 死锁是指两个或多个事务在执行过程中,因争夺资源而相互等待,导致所有事务都无法继续执行的一种情况。 原因 死锁通常是由于多个事务同时获取了部分资源,然后等待其他事务释放资源,从而导致无法继续执行。例如,事务A获取了资源X并等待资源Y,同时事务B获取了资源Y并等待资源X,这时发生死锁。 解决方法 重启MySQL服务,这…

    database 2023年5月22日
    00
  • Redis API

    启动 最简启动 命令行输入 redis-server # 使用默认配置 验证 ps-ef I grep redis netstat-antpl I grep redis redis-cli-h ip-p port ping 动态参数启动 redis-server -p 6380 配置文件启动 redis-server /path/to/conf 常用配置 d…

    Redis 2023年4月13日
    00
  • MYSQL 优化常用方法

    MYSQL 优化常用方法 MYSQL 是一种开源的关系型数据库管理系统,被广泛应用于各种规模的网站和应用程序。优化 MYSQL 数据库的性能是每个 MYSQL 数据库管理员所必需的技能之一。下面是 MYSQL 优化常用方法的完整攻略: 1. 使用索引 索引是常用的 MYSQL 优化方法之一。合理使用索引可以加快数据查询和数据检索的速度,提高数据查询的效率。通…

    database 2023年5月19日
    00
  • MySQL慢查询日志的配置与使用教程

    MySQL慢查询日志的配置与使用教程 MySQL慢查询日志是MySQL自带的一种日志类型,用于记录执行时间超过阈值的SQL语句的详细信息,包括执行时间、扫描行数和返回行数等,可以帮助我们分析和优化查询效率。下面是MySQL慢查询日志的配置与使用教程。 配置MySQL慢查询日志 1. 打开MySQL配置文件 打开MySQL的配置文件,一般位于/etc/my.c…

    database 2023年5月22日
    00
  • 安装SQL2005 29506错误码的解决方案

    安装SQL2005时,有时会遇到29506错误码的问题。这个问题的产生原因是因为用户的权限不足或者用户没有完全控制数据库安装目录。以下是解决这个问题的两种常见方法: 方法一:使用管理员命令行安装 打开cmd命令行,在命令行以管理员身份运行(右键cmd,选择“以管理员身份运行”) 明确安装目录位置,在cmd中输入: MSIEXEC /i "D:\SQ…

    database 2023年5月21日
    00
  • Zookeeper如何实现分布式服务配置中心详解

    Zookeeper如何实现分布式服务配置中心详解 什么是Zookeeper Zookeeper是一个典型的分布式数据一致性解决方案,是Google Chubby在开源领域的实现,提供了分布式应用系统的协调服务,如配置维护、命名服务、同步服务、组服务等。 Zookeeper作为服务配置中心的应用 服务配置中心是比较常用的分布式架构中的一部分,它的目的是帮助我们…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部