/*
名称:spAll_ReturnRows
输入:
输出:
调用:
EXEC spAll_ReturnRows 'select * FROM 表名', 页号, 返回记录数, '主键', '排序字段'
spAll_ReturnRows 'select * FROM all_Categories',2,10,'[ID]','[ID]'
说明:[百万级]通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录
作者:Dili J.F. Senders
邮件:diliatwellknow.net
更新:20040610
版权:转述时请注明来源:用思维创造未来的Wellknow.net
*/

create PROCEDURE dbo.spAll_ReturnRows
(
@SQL nVARCHAR(4000),
@Page int,
@RecsPerPage int,
@ID VARCHAR(255),
@Sort VARCHAR(255)
)
AS

DECLARE @Str nVARCHAR(4000)

SET @Str='select TOP '+cast(@RecsPerPage AS VARCHAR(20))+' * FROM ('+@SQL+') T where T.'+@ID+' NOT IN
(select TOP '+cast((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+' '+@ID+' FROM ('+@SQL+') T9 ORDER BY '+@Sort+') ORDER BY '+@Sort

PRINT @Str

EXEC sp_ExecuteSql @Str
GO

/*
名称:spAll_deleteNoneUnique
输入:要查询的表名和字段列表
输出:
调用:
说明:实现千万级数据的分页显示!--可以在5秒内获取1448万条记录里的第1200页的100条记录,雄不?
作者:铁拳版权:转述时请注明来源:用思维创造未来的Wellknow.net
*/

create PROCEDURE GetRecordFromPage
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@IsCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strwhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL varchar(6000) -- 主语句
declare @strTmp varchar(100) -- 临时变量
declare @strOrder varchar(400) -- 排序类型

if @OrderType != 0
begin
set @strTmp = "<(select min"
set @strOrder = " order by [" + @fldName +"] desc"
end
else
begin
set @strTmp = ">(select max"
set @strOrder = " order by [" + @fldName +"] asc"
end

set @strSQL = "select top " + str(@PageSize) + " * from ["
+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
+ @strOrder

if @strwhere != ''
set @strSQL = "select top " + str(@PageSize) + " * from ["
+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @fldName + "] from [" + @tblName + "] where " + @strwhere + " "
+ @strOrder + ") as tblTmp) and " + @strwhere + " " + @strOrder

if @PageIndex = 1
begin
set @strTmp = ""
if @strwhere != ''
set @strTmp = " where " + @strwhere

set @strSQL = "select top " + str(@PageSize) + " * from ["
+ @tblName + "]" + @strTmp + " " + @strOrder
end

if @IsCount != 0
set @strSQL = "select count(*) as Total from [" + @tblName + "]"

exec (@strSQL)

GO
个人研究百万级数据提出问题总结如下:
1.除了提高硬件方面
2.采取折中方法,一次提出几百万数据也没有什么实在意义

不过存储过程写的还是很精妙。

p=pagesize,n为返回页数,SQL="select * from product where id<200000"

1.(select * from product where id<200000) as t
2.(select top p*(n-1) t.id from t order by id asc) as t1
3.select top p * from t where id not in t1 order by id asc

SQL:
select top p * from (select * from product where id<200000) t where t.id not in (select top p*(n-1) id from t order by id asc) order by id asc
[注:子查询里面别名t 其实并不存在,应该用1.重新代替]

SQL存储过程:
SET @str='select top'+cast(@p as varchar(20))+' * from ('+@SQL+') t where t.'+@ID+' not in (select top '+cast((@p*(@n-1)) as varchar(20))+' '+@ID+' from ('+SQL+') order by '+@Sort+') order by '+@Sort

PRINT @str

百万级数据测试结果如下:
//
///result:100W数据
///
///条件:VirtualItemCount=200000
///->转1页 33.924982085712 milliseconds,33.3696042374101 milliseconds,31.1483722093171 milliseconds
///->转1000页 247.380882207096 milliseconds,190.643224208663 milliseconds,240.085262233049 milliseconds
///->转10000页 2393.90201827327 milliseconds,1903.65535284512 milliseconds,1839.06278591273 milliseconds
///
///条件:VirtualItemCount=all
///->1 10.2540965402027 milliseconds,7.47608983823363 milliseconds,15.5991892824367 milliseconds
///->1000 273.380555349912 milliseconds,190.414982909839 milliseconds,217.308345055028 milliseconds
///->10000 1845.92064075183 milliseconds,1951.84974626663 milliseconds,1904.51831168487 milliseconds
///
///2s处理百万数据
//

转载于:https://www.cnblogs.com/Destiny_1112/archive/2010/01/23/1654709.html

[百万级]通用分页存储过程.[千万级]实现千万级数据的分页显示!相关推荐

  1. 从通用分页存储过程[ROWCOUNT方式]抽出适合自己需求的分页过程

    通用分页存储过程很实用,但毕竟不是全适用于一些环境,譬如我遇到过一种情况,需要先外链两个表,然后再关联几个表,总之参数传递很烦人,这里不细说了,现在只谈实现查询后,怎么分页的简单技巧 1,建立用户函数 ...

  2. SQL 分页存储过程(转)

    因为邹建的分页存储过程不能返回记录总数,所以每次分页还又要统计一次,所以自己在里面加了个返回记录数,这下就好用了. @iPageCount int OUTPUT  --定义输出变量,放在@QueryS ...

  3. oracle存储过程 多条件,Oracle多条件查询实际分页存储过程实操

    以下的文章主要是介绍Oracle多条件查询分页存储过程,以下就是Oracle多条件查询分页存储过程具体方案的描述,希望在你今后的学习中会有所帮助.将业务逻辑放到Oracle中使得后台代码很精简,Ora ...

  4. 用于jqGrid获取SQL Server中数据的简单分页存储过程及sp_executesql的一点使用方法...

    之前我第一篇有关jqGrid JSON数据的获取是动态拼接的SQL语句(因为是Access数据库),然后我自己也用SQL Server中的数据作了测试,为了方便写了一个分页的存储过程,过程中也认识了下 ...

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

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

  6. MySQL limit 优化,百万至千万级快速分页:复合索引

    2019独角兽企业重金招聘Python工程师标准>>> MySQL 性能到底能有多高?用了php半年多,真正如此深入的去思考这个问题还是从前天开始.有过痛苦有过绝望,到现在充满信心! ...

  7. oracle千万级分页优化,oracle千万级数据分页存储过程优化

    随着数据量的增加,Oracle数据库分页存储过程(使用rownum分页)查询性能越来越差,查询时间也越来越长,于是优化势在必行,结合用户一般使用特点(一般看前几页的较多),于是以此为切入点优化原先的存 ...

  8. 毫秒级百万数据分页存储过程

    然后创建分页存储过程;这个是基于SQL 2005 的ROW_NUMBER的, SQL 2000 不适用; SQL 2008 我没有安装,所以也没有测试过!估计应该可以运行. 2种算法可以选择 1. 使 ...

  9. php超大树形分页,PHP+MySql千万级数据limit分页优化方案

    PHP+MySql千万级数据limit分页优化方案 1年前 阅读 2750 评论 0 喜欢 0 ### 原因 徒弟突然有个需求,就是他发现limit分页,页数越大之后,mysql的消耗越大,查询时间越 ...

  10. MySQL 百万级/千万级表 全量更新

    业务需求:今天从生成测试环境迁移了一批百万级/千万级表的数据,领导要求将这批数据进行脱敏处理(将真实姓名 .电话.邮箱.身份证号等敏感信息进行替换).迁移数据记录数如下(小于百万级的全量更新不是本文重 ...

最新文章

  1. 聊聊三维重建-条纹法之相位法(一)
  2. Python调用HTTP接口并传递cookie
  3. 全文检索技术_中药图片拍照识别系统,爬虫、深度学习技术android app 源码分享...
  4. Java-static关键字
  5. Android笔记 使用AIDL和远程服务实现进程通信
  6. 客户端本地存储的比较及使用window.name数据传输
  7. Kinetic使用注意点--circle
  8. mysql_affected_rows mysqli_关于mysqli_affected_rows()函数的详细介绍
  9. 【Django 2021年最新版教程17】数据库操作 models 存在更新 不存在新建update_or_create
  10. 解决Safari使用谷歌搜索引擎需要二次确认
  11. python中类对象和实例对象_python基础之类和对象、对象之间的交互、类名称空间与对象/实例名称空间...
  12. 王者荣耀8月6日服务器维护,8月6日体验服停机更新公告
  13. 【R-CNN目标检测系列】三、IoU与非极大抑制
  14. 记一次计算机课作文,记一次课堂活动作文500字
  15. 爬取动态网页(qq音乐)
  16. VScode远程调试remote development
  17. SpringBoot项目集成UniPush推送服务
  18. 让DedeCMS的栏目页标题显示页码数
  19. [线段树][ZZNUOJ]易水寒
  20. 弹性域报表实例(四)

热门文章

  1. [LeetCode] Decode Ways [33]
  2. JavaScript中的navigator对象学习笔记
  3. IntelliJ IDEA 13怎么创建JAVA SE项目
  4. Luogu1525 关押罪犯
  5. [2018.10.10 T2] 烯烃
  6. js高级学习笔记(b站尚硅谷)-3-对象
  7. python成员变量_Python——成员变量
  8. java 观察者模式_观察者模式(Observer Pattern)
  9. gson下载java_gson.jar
  10. c++实现一个敏感词汇的程序_一个C++程序员生产力,大概相当20个C程序员,200个java程序员?...