过程一:
select top N条记录 * from 文章表 where id not in(select top M条记录 id from 文章表 order by id desc ) order by id desc

过程二:
select top N条记录 * from 文章表 where id <(select min(id) from (select top M条记录 id from 文章表 order by id desc ) as tblTmp) order by id desc

--简单通用
CREATE PROCEDURE [dbo].[PageView]
    @select VARCHAR(max),
    @CurrentPage INT,
    @PageSize INT
AS
BEGIN
    declare @sql NVARCHAR(max)
    DECLARE @RecordCurrent INT
    DECLARE @PageCount INT
    DECLARE @RecordCount INT
    SET NOCOUNT ON
    set @sql='select @RecordCount=count(*) from ('+@select+') a'
    exec sp_executesql @sql,N'@RecordCount int output',@RecordCount output
    SET @PageCount=(@RecordCount+@PageSize-1)/@PageSize
    IF ISNULL(@CurrentPage,0)<1
        SET @CurrentPage=1
    ELSE if ISNULL(@CurrentPage,0)>@PageCount
        SET @CurrentPage=@PageCount
    SELECT @CurrentPage AS CurrentPage,@RecordCount AS RecordCount,@PageSize AS PageSize,@PageCount AS PageCount
    set @sql='select * from ('+@select+') a where rownumber between '+cast((@CurrentPage-1)*@PageSize+1 as varchar)+' and '+cast(@CurrentPage*@PageSize as varchar)
    exec (@sql)
END
--使用not in 方式的存储过程
create PROCEDURE GetPageDataByNotIn
@PageIndex int,/**//*当前页数*/
@PageSize int/**//*每页大小*/
AS
declare @starttime datetime
    set @starttime=getdate()
IF @PageIndex > 0
BEGIN
set nocount on;
DECLARE @PageLowerBound int
DECLARE @StartID int
DECLARE @sql varchar(225)
SET @PageLowerBound = @PageSize * (@PageIndex-1)
IF @PageLowerBound<1
   SET @PageLowerBound=1
    print @PageLowerBound
select top (@PageSize) * from table where [ar_id] not in (select top ((@PageSize)*(@PageIndex-1)) ar_id from table )
EXEC(@sql)
set nocount off;
END
print '耗时='+convert(varchar(30),datediff(ms,@starttime,getdate()))
-------------------------------------------------------------------------------------------------------
--使用ROWCOUNT的分页存储过程
create PROCEDURE GetPageData
@PageIndex int,/**//*当前页数*/
@PageSize int/**//*每页大小*/
AS
declare @starttime datetime
    set @starttime=getdate()
IF @PageIndex > 0
BEGIN
set nocount on;
DECLARE @PageLowerBound int
DECLARE @StartID int
DECLARE @sql varchar(225)
SET @BeginIndex = @PageSize * (@PageIndex-1)
IF @BeginIndex<1
   SET @BeginIndex=1
SET ROWCOUNT @BeginIndex
SELECT @StartID = [ar_id] FROM table ORDER BY ar_id
print @StartID
SET ROWCOUNT 0
SET @sql='select top '+str(@PageSize) +' * from table where [ar_id]>='+ str(@StartID) +' ORDER BY [ar_id] '
EXEC(@sql)
set nocount off;
END
print '耗时='+convert(varchar(30),datediff(ms,@starttime,getdate()))

-----------------------------------------------------------------------------------------------------
测试查询一张有100W条数据的表table,每页显示10条数据
存储过程                        第1页   第10页   第100页   第1000页   第5000页  
GetPageDataByNotIn    0           0            126           13530       等了2分多钟没耐性了....
GetPageData                0           0            0               16              76

------------------------------------------------------------------------------------------------------------
最后使用的存储过程(推荐):
create PROCEDURE GetPageData
(
@TableName varchar(30),--表名称
@IDName varchar(20),--表主键名称
@PageIndex int,--当前页数
@PageSize int--每页大小
)
AS
IF @PageIndex > 0
BEGIN
set nocount on
   DECLARE @PageLowerBound int,@StartID int,@sql nvarchar(225)
   SET @PageLowerBound = @PageSize * (@PageIndex-1)
   IF @PageLowerBound<1
    SET @PageLowerBound=1
   SET ROWCOUNT @PageLowerBound
   SET @sql=N'SELECT @StartID = ['+@IDName+'] FROM '+@TableName+' ORDER BY '+@IDName
     exec sp_executesql @sql,N'@StartID int output',@StartID output
   SET ROWCOUNT 0
   SET @sql='select top '+str(@PageSize) +' * from '+@TableName+' where ['+@IDName+']>='+ str(@StartID) +' ORDER BY ['+@IDName+'] '
   EXEC(@sql)
set nocount off
END

转载于:https://www.cnblogs.com/dingxiaowei/archive/2012/09/21/3058803.html

最快的存储过程分页 50W相关推荐

  1. 常见存储过程分页PK赛——简单测试分析常见存储过程分页速度

    数据的分页是我们再熟悉不过的功能了,各种各样的分页方式层出不穷.今天我把一些常见的存储过程分页列出来,再简单地测一下性能,算是对知识的总结,也是对您好想法的抛钻引玉.废话不多说,开始吧~~ 1.首先建 ...

  2. 超经典的存储过程分页 ;-) 引自CSDN网友所作

    主 题: 好东西分享哟!! 利用SqlServer内部存储过程实现快速方便的分页 作 者: zxbyhcsdn (沙子)        Blog 等 级: 信 誉 值: 97 所属社区: MS-SQL ...

  3. (转)几种常用存储过程分页方法

    我们先给出几种主要的分页方法和核心语句,然后直接给出结论,有兴趣的读者可以看看后面的数据 几种常用存储过程分页方法 TopN方法 select Top(@PageSize) from TableNam ...

  4. [百万级]通用存储过程.分页存储过程

    /*  名称:spAll_ReturnRows  输入:  输出:  调用:   EXEC spAll_ReturnRows 'SELECT  * FROM 表名', 页号, 返回记录数, '主键', ...

  5. mysql通用分页_MySQL海量数据的通用存储过程分页代码

    本节主要内容: MySQL海量数据的通用存储过程分页代码 本节为大家分享一例mysql 通用存储过程分页.海量数据分页的代码. 1,测试用的表结构: 复制代码 代码示例: CREATE TABLE I ...

  6. MS SQLSERVER通用存储过程分页

    最近在面试的时候,遇到个奇葩的秃顶老头面试官. 问:写过存储过程分页吗? 答:没写过,但是我知道分页存储的原理,我自己也写过,只是在工作中没写过. 问:那你这么多年工作中就没写过吗? 答:的确没写过, ...

  7. sql 存储过程 分页

    ---存储过程:分页,获得第@endrecord-@num+1条到第@endrecord条记录的研报信息 IF exists (select * from SysObjects where name= ...

  8. 非存储过程分页- 前台分页样式和控件

    非存储过程分页- 前台分页样式和控件 一.   DAL /// ///分页sql /// public DataTable GetUserAndError(int pageSize, int page ...

  9. SQL存储过程分页(通用的拼接SQL语句思路实现)

    多表通用的SQL存储过程分页 案例一: USE [Community] GO/****** Object: StoredProcedure [dbo].[Common_PageList] Script ...

最新文章

  1. 【Linux基础】文件处理实例
  2. python写错了怎么更改-Python中修改字符串的四种方法
  3. GRE核心词汇助记与精练-List10感觉,感情
  4. 敏感词过滤的php代码,php实现敏感词过滤(Trie树)
  5. MyEclipse下安装MyBatis Generator代码反向生成工具
  6. CKEditor的使用方法
  7. mysql客户端程序介绍
  8. 【Elasticsearch】es 别名可写 索引可写 傻傻分不清
  9. python 遍历文件夹
  10. Zookeeper Java客户端搭建
  11. html svg 编辑器
  12. 关于ATmega328P和ATmega328PB中16位定时器的使用
  13. 西门子阀门定位器安装教程来啦,不会安装的宝贝们仔细看看咯!
  14. Windows漏洞补丁更新网址
  15. 用phpexcel导入导出文件
  16. 工作流学习2(书本)
  17. STM32延时函数的四种方法
  18. Java-翁恺进阶 城堡游戏的前世今生
  19. cad2020卸载工具_2020年您应该拥有的12个自由职业者设计工具
  20. 【java】Integer == Integer?

热门文章

  1. 概述--Nginx集成Vcenter 6.X HTML Console系列之 1--(共4)
  2. javascript中字符串常用方法
  3. python-组合数据类型
  4. 9种对抗电脑辐射的方法
  5. 用python批量下载modis数据的速度怎么样_MODIS数据的简介和下载(五)——应用密钥的Python脚本下载...
  6. Redis(三)主从复制实现高可用(redis—sentinel)
  7. Python中的问卷调查(华为机测题)
  8. Java中抽象类和接口的区别(来源二,原始来源不明确)
  9. VC++6.0 单步调试
  10. Kava Labs已上线Trust Wallet专用桥接器以提供DeFi产品服务