第一种方法:效率最高

SELECT TOP 页大小 *

FROM( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1 )as A 

WHERE RowNumber > 页大小*(页数-1)

 

--注解:首先利用Row_number()为table1表的每一行添加一个行号,给行号这一列取名'RowNumber' 在over()方法中将'RowNumber'做了升序排列

--然后将'RowNumber'列 与table1表的所有列 形成一个表A

--重点在where条件。假如当前页(currentPage)是第2页,每页显示10个数据(pageSzie)。那么第一页的数据就是第11-20条

--所以为了显示第二页的数据,即显示第11-20条数据,那么就让RowNumber大于 10*(2-1)

存储过程 (表名aa)

if(exists(select* from sys.procedures where name='p_location_paging'))--如果p_location_paging这个存储过程存在

drop proc p_location_paging  --那么就删除这个存储过程

go

create proc p_location_paging(@pageSize int, @currentPage int)--创建存储过程,定义两个变量'每页显示的条数'和'当前页'

as

select  top (@pageSize) * from (

select ROW_NUMBER() over(order by locid) as rowid ,* from  aa

)as A where rowid> (@pageSize)*((@currentPage)-1)

第二种方法:效率次之

SELECT TOP 页大小 *  --如果每页显示10条数据,那么这里就是查询10条数据

FROM table1

WHERE id >  --假如当前页为第三页,那么就需要查询21-30条数据,即:id>20

        (

            SELECT ISNULL(MAX(id),0)  --查询子查询中最大的id

            FROM

                (

                    SELECT TOP 页大小*(当前页-1) id FROM table1 ORDER BY id
--因为当前页是第三页,每页显示十条数据。那么我将: 页大小*(当前页-1),就是获取到了在"当前页""前面"的20条数据。所以上面用max(id)查询最大的id,取到这个20,那么前面的where 条件的id>20 即取到了第三页的数据,即取21-30条数据                 ) as A            ) ORDER BY id
存储过程(表名 aa)
if(exists(select * from sys.procedures where name='p_location_paging')) drop proc p_location_paging go create proc p_location_paging(@pageSize int ,@currentPage int) as select  top (@pageSize) * from aa where locId>(select ISNULL(MAX(locId),0) from (select top ((@pageSize)*(@currentPage-1))locid from location  order by locId) as a )order by locId

第三种方法:效果最差

SELECT TOP 页大小 *

FROM table1

WHERE id NOT IN --where条件语句限定要查询的数据不是子查询里面包含的数据。即查询"子查询"后面的10条数据。即当前页的数据

        (

           --如果当前页是第二页,每页显示10条数据,那么这里就是获取当前页前面的所有数据。

           SELECT TOP 页大小*(当前页-1) id FROM table1 ORDER BY id

        )

ORDER BY id

高性能SQLServer分页语句的更多相关文章

  1. Sqlserver2008和Oracle分页语句

    SqlServer 分页语句 select StuID ,StuNo,StuName,Age,Sex, ClassName ClassName from (select *, row_number() ...

  2. sqlserver分页;mysql分页;orcale分页 的sql 查询语句

    一,sqlserver分页: )) ID FROM 表名 AS 表名1_1 ORDER BY ID)) ORDER BY ID; 二:mysql分页 )*每页显示的数据条数,当前页码 * 每页显示的数 ...

  3. SQLServer分页查询存储过程

    项目中用到的SQLServer分页查询存储过程. [存储过程] create PROCEDURE prcPageResult -- 获得某一页的数据 -- @currPage int = 1,     ...

  4. SQLServer2012 分页语句执行分析

    上一篇文章提到了,SQLServer2012在使用Offset,Fetch语句分页时,获取了大量不需要的数据,导致查询效率低的问题. 现在让我们来看看,究竟是什么导致SQLServer不能按需取数呢? ...

  5. SqlServer常用语句

    首先,写这个的原因是我其实sql语句不太行,总觉得自己写得很乱,好像也没有系统学习过,借此复习和与大家探讨 No.1 关于查询时间区间是否重叠的sql语句 问题是这样:插入之前,想查询同User是否其 ...

  6. [搜片神器]服务器SQL2005查询分页语句你理解了么

    在sosobt.com网站准备采用Lucence.net来进行索引处理搜索慢问题的时候,突然发现常用的分页获取数据的row_number也支持不住了,后期查到200多万的时候非常慢(总数据有500万) ...

  7. Mysql 分页语句Limit用法

    转载自:http://qimo601.iteye.com/blog/1634748 1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用 ...

  8. SQL分页语句总结

    今天对分页语句做一个简单的总结,他们大同小异的,只要理解其中一个其他的就很好理解了. 使用top选项 selecttop10*from Orders a where a.orderid notin(s ...

  9. SQLSERVER PRINT语句的换行

    原文:SQLSERVER PRINT语句的换行 SQLSERVER  PRINT语句的换行 想在输出的PRINT语句里面换行,可以这样做 /* SQL的换行 制表符 CHAR(9) 换行符 CHAR( ...

随机推荐

  1. 机器学习之DBSCAN聚类算法

    可以看该博客:https://www.cnblogs.com/aijianiula/p/4339960.html 1.知识点 """ 基本概念: 1.核心对象:某个点的密 ...

  2. Mysql 查询当前数据上一条和下一条的记录

    获取当前文件上一条与下一条记录的原理是上一条的sql语句,从news表里按从大到小的顺序选择一条比当前ID小的新闻,下一条的sql语句,从news表里按从小到大的顺序选择一条比当前ID大的新闻. 如果 ...

  3. [Kaggle] How to kaggle?

    成立于2010年的Kaggle是一个进行数据发掘和预测竞赛的在线平台.与Kaggle合作之后,一家公司可以提供一些数据,进而提出一个问题,Kaggle网站上的计算机科学家和数学家,也就是现在所说的数据 ...

  4. IPv4 ping命令

    IPv4 ping命令 一.Linux操作系统 给一台 Linux 主机分配了一个 IPv4 的 IP地址,如何使用 ping命令 确定该 IP地址 能否 ping 通呢? 1.查看主机的 IPv4 ...

  5. Python 面向对象(下)

    本篇博客承接自Python 面向对象(上) 四. 继承,实现,依赖,关联,聚合,组合 Python面向对象--继承,实现,依赖,关联,聚合,组合 五. 特殊成员 Python面向对象--类的特殊成员 ...

  6. android#ListView的简单用法

    新建项目,并修改项目生产的主文件activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/ap ...

  7. 【jQuery】attr()、prop()、css() 的区别(转载)

    .attr( ) 可以设置元素的属性(也就是给元素新增加一个原来并不存在的属性)也可以获取元素的本来就有的属性以及额外设置的属性.如果要获取的属性没有设置,那么获取到的结果是 undefined; . ...

  8. PHP SQL注入

    开发者容易遗漏的输入点: HTTP头 X-Forwarded-For   获取用户ip User-Agent            获取浏览器 Referer                  获取之 ...

  9. 【VS开发】【C/C++开发】printf缓冲区刷新

    printf之缓冲区小结: 今天调试程序,发现了一个有趣的现象,printf函数没有按照预期的结果输出重复的字符串,单步调试显示代码的确走到了打印屏幕的分支,没有显示不由得想到了是不是缓冲区去刷新的问 ...

  10. day18 time、datetime、calendar、sys、os、os.path模块

    今日内容 时间模块 time模块 datetime模块 calendar模块 系统模块 sys模块 os模块 os.path模块 time模块: 在 time 模块中使用最多的方法有: time() ...