`

关于sqlserver 分页问题

 
阅读更多

以前看网上不少人的说ROW_NUMBER在处理分页的时候效率很高,代替了TOP

上午你说过之后我又做了查看和分析,看了一些资料。做了如下分析:

1、 ROW_NUMBER的原理决定了他和 双TOP主键方式是要取同样的page,都是按顺序扫描,知道最后所需要的。所以两者差距并不大,

2、 如果翻页多了,在后面的页,ROW_NUMBER 还是对整个表扫描,但是 双TOP就可能逆序来扫描。就会比ROW_NUMBER更优

3、 我们平时用的最普遍的ROW_NUMBER 写法是错误的。并没有达到我们想要的结果

DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int

SELECT @START_ROW = 1, @MAX_ROWS = 25;

WITH PAGED AS (

SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum, *

FROM TRANS_TABLE(NOLOCK)

)

SELECT *

FROM PAGED

WHERE ROWNUM BETWEEN@START_ROW AND @START_ROW + @MAX_ROWS - 1

常用的那个方法执行计划经常是表扫描,因为附带了其它的多余的列

改用取主键值,然后JOIN才会更高效的利用索引

DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int

SELECT @START_ROW = 1, @MAX_ROWS = 25;

WITH PAGED AS (

SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum, MYID

FROM TRANS_TABLE(NOLOCK)

)

SELECT TT.*

FROM PAGED PGD

INNER JOIN TRANS_TABLE TT

ON PGD.MYID = TT.MYID

WHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS - 1

ORDER BY MyDate, MYID

4、 然后说下TOP,通常TOP是有三种写法(假设id列上有聚集索引)

--1

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

--2

SELECT * FROM(SELECT TOP 10 * FROM (SELECT TOP 20 id FROM tb ORDER BY id)a ORDER BY id DESC)b ORDER BY id

--3

SELECT TOP 10 * FROM tb WHERE id>(

SELECT ISNULL(max(id),0) FROM

(SELECT TOP 20 idFROM tb ORDER BY id) t

)

其中2最差,因为要反复排序,1次之,3最优,开销仅是在查找id,然后就使用INDEX SEEK

5、 另外一个疑问,如果数据量大了,先对总页数进行判断,然后从数据中间开始,

如果需要的的页在前面 就用正双向TOP,如果在后面就用反向TOP取最小值id

就是把上面的3改成

SELECT TOP 10 *FROM Stock WHERE id>(

SELECT ISNULL(min(id),0) FROM

(SELECT TOP 20/*这里的在实际环境中需要计算得到*/ id FROM Stock ORDER BY id desc) t

)

如果是存储过程把 SELECT ISNULL(max(id),0) FROM

(SELECT TOP 20 idFROM tb ORDER BY id) t

这一段分出来写效果会更好。

分享到:
评论

相关推荐

    mybatis中进行sqlserver分页

    mybatis中,sqlserver分页

    sql Server 通用分页存储过程

    sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程

    sqlserver分页查询语句

    sqlserver分页查询语句;sqlserver分页查询语句;sqlserver分页查询语句;

    sql server 分页

    sql server分页代码 --分页【top】:不支持复合主键 SELECT TOP 10 * from Lend where id not in (SELECT TOP ((2-1)*10) id from lend ORDER BY id) ORDER BY id ; SELECT TOP 10 * from Lend where id not ...

    sql server分页技术(SQL Server 与Access数据库相关分页技术)

    以下是几种常用的SQL Server分页技术: 1. **TOP 和 NOT IN** 分页: 这种方法通过`TOP`关键字选取指定数量的记录,然后使用`NOT IN`子句排除已选取的记录。例如,查询第二页的记录,可以先选取前`@RecordStart`个...

    jsp+sqlserver分页

    **标题:“jsp+sqlserver分页”** 在Web开发中,分页是一种常见的用户界面设计技术,用于在大量数据中提供可浏览性。本项目基于`SQL Server 2005`数据库,结合`Struts`框架和`JavaBean`组件,实现了在JSP页面上进行...

    SQLServer分页.rar

    本资源"SQLServer分页.rar"包含了一个名为"SQL分页.txt"的文件,里面详细讲解了SQL Server中的分页实现方法。 首先,我们来理解SQL Server分页的基本概念。分页通常涉及到两个关键参数:`OFFSET`和`FETCH NEXT`。`...

    sql server 2008通用分页

    SQL server2008中通用分页存储过程,表名,每页长度,页码都是动态赋值。

    sql server 分页大全

    在SQL Server数据库管理中,分页查询是一种常用的技术,它允许用户按页面浏览大量数据,而不是一次性加载所有结果。在大型数据库中,这可以显著提高性能,减少内存消耗,并提供更好的用户体验。本篇文章将深入探讨...

    SQL server 分页查询

    ### SQL Server分页查询概述 分页查询是指从大量数据中按需取出一部分数据的过程,通常用于网页展示或大型数据报表中,以提高加载速度和减少服务器负担。在SQL Server中,实现分页查询有多种方法,包括使用`ROW_...

    java 连接sqlserver数据库查询,并分页显示

    String url = "jdbc:sqlserver://localhost:1433;databaseName=myDatabase"; String username = "myUsername"; String password = "myPassword"; try { Class.forName(...

    jsp+sql server分页技术

    ### SQL Server分页 SQL Server提供了多种分页查询的方法,例如使用`TOP`和`ORDER BY`,或者`ROW_NUMBER()`窗口函数。这里我们主要介绍使用`ROW_NUMBER()`的方式,因为它更灵活且性能优秀。 ```sql WITH PagedData ...

    Sql Server 通用分页存储过程(适用与 BootStrap Table)

    通用的Sql Server分页程序,并且符合BootStrap Table 的调用标准.

    sqlserver分页器

    简易的sqlserver分页功能,只需要将页码传入即可,默认id倒序排列,一页十条,也可以通过传入不同参数,对不同字段,进行正序或倒序排列。 使用方法:1、将该类导入实体类包中 2、在需要分页的地方创建该类对象,并...

    EXT JSON Sqlserver 分页 全部正常运行

    【EXT JSON Sqlserver 分页 全部正常运行】 在IT领域,这个标题涉及到的是一个使用EXT JS(一种基于JavaScript的富客户端框架)和JSON(JavaScript Object Notation)数据格式,结合SQL Server数据库实现分页功能的...

    sqlserver+group by分组查询分页存储过程

    根据给定的SQL Server存储过程代码片段,我们可以深入解析与SQL Server中的`GROUP BY`分组查询、存储过程以及分页技术相关的知识点。 ### SQL Server中的`GROUP BY`分组查询 `GROUP BY`子句在SQL查询语言中用于将...

    ASP.NET基于SQLServer的分页

    3. **SQL Server分页查询** - `TOP`子句:在SQL Server中,可以使用`TOP`子句配合`ORDER BY`来实现分页。例如,获取第一页的数据,可以写成`SELECT TOP pageSize * FROM table ORDER BY sortField DESC`。 - `...

    java语言的分页查询功能(mysql和sql server)

    2. 使用ROW_NUMBER()优化:在SQL Server中,使用`ROW_NUMBER()`结合子查询可以避免`OFFSET`的性能问题,尤其是在大数据量时。 3. 计算总页数:在Java中,通常需要计算总页数,可以通过单独查询获取总记录数再除以每...

    最简单的SQL Server数据库存储过程分页

    传统的T-SQL分页方法可能会导致性能问题,尤其是在面对百万级别的数据集时。本文介绍一种简单且高效的SQL Server存储过程实现分页的方法,这种方法仅需提供SQL语句、每页的记录数以及当前页数即可快速完成分页操作。...

Global site tag (gtag.js) - Google Analytics