实现千万级数据的分页显示--整理资料并测试

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

原帖子如下:

/*
 名称:spAll_DeleteNoneUnique
 输入:要查询的表名和字段列表
 输出:
 调用:
 说明:实现千万级数据的分页显示!--可以在5秒内获取1448万条记录里的第1200页的100条记录,雄不?
 作者:铁拳
 邮件:
 网站:http://www.wellknow.net
 更新:20040610
 支持:http://bbs.wellknow.net
 版权:转述时请注明来源:用思维创造未来的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



修改后,便于使用的代码:


修改一点点便于其他人使用 
CREATE  PROCEDURE GetRecordFromPage 
@tblName  varchar( 255),  --  表名 
@fldName  varchar( 255),  --  字段名 
@OrderfldName  varchar( 255),  --  排序字段名 
@StatfldName  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  [ " + @OrderfldName +" ]  desc
end 
else 
begin 
set @strTmp  = " >( select  max
set @strOrder  = "  order  by  [ " + @OrderfldName +" ]  asc
end 

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

if @strWhere  !=  '' 
set @strSQL  = " select  top "  +  str(@PageSize)  + " "  + @fldName  + "  from  [
+ @tblName + "
]  where  [ " + @OrderfldName + " ]+ @strTmp  + "( [
+ @OrderfldName + "
]from ( select  top "  +  str((@PageIndex - 1) *@PageSize)  + "  [
+ @OrderfldName + "
]  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)  + " "  + @fldName  + "  from  [
+ @tblName + "
]+ @strTmp  + " "  + @strOrder 
end 

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

exec (@strSQL) 

GO 


说明:
增加了下面两个部分,其他人拷贝去可根据自己需要进行设定。 
@OrderfldName varchar(255), -- 排序字段名 
@StatfldName varchar(255), -- 统计字段名 

fldName作用由排序转变为控制需要打开的字段。 
@fldName varchar(255), -- 字段名 

----------------------------------------------
个人测试结果:
通过测试,性能并没有原帖子所说的好。但这可能是机器原因,要知道,在SQL Server中, 2千万条空记录大约要占用3G左右的空间 ,而 插入这2千万条记录 ,在我的测试平台上耗费了 近10个小时,内存占用从125M增长到350M左右 。我实际测试了一下,在建立索引的情况下,执行一次根据主键,返回一条记录的查询,在512M内存,2.2G CPU,20G单分区存储数据库文件,100M局域网的配置情况下,平均大约需要15s左右(这只是我的个人测试,不具有任何实质性意义。)。

另外我发现,对于上述配置的机器,运行SQL Server时,在百万级别以下的表中执行查询--(索引良好,没有坏点,或者最新索引),速度差别不大,但达到8位数以上,也就是千万以上时候,SQL Server表现就不太好了,当然,这与机器配置有很大关系了。但无可否认,SQL Server  2000还不是企业级数据库的最佳选择,在Oracle执行类似的查询,性能要好于SQL Server。插入执行完毕的时间是4个小时,内存占用一直没有变化:400M。执行相同查询,需要的时间是10s左右。

小弟最近忙于一个公积金项目,对于部门数据库、中央数据库的调度进行了一些评估,Oracle软件+SUN/HP的硬件仍然占了中国政府机构服务器的大部分市场,再就是IBM,占据了高端和甚高端的大部分业务。

微软在这方面打个胜仗,还有很长的路要走--个人认为,和硬件公司合作研发相配套硬件是不二法门。


本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/sgsoft/archive/2004/10/23/55800.html,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
18小时前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
|
1月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
36 6
|
1月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段。本文介绍了 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,强调了样本量、随机性和时间因素的重要性,并展示了 Python 在 A/B 测试中的具体应用实例。
30 1
|
2月前
|
存储 测试技术 数据库
数据驱动测试和关键词驱动测试的区别
数据驱动测试 数据驱动测试或 DDT 也被称为参数化测试。
37 1
|
2月前
|
机器学习/深度学习 监控 计算机视觉
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
本文介绍了如何使用YOLOv7进行目标检测,包括环境搭建、数据集准备、模型训练、验证、测试以及常见错误的解决方法。YOLOv7以其高效性能和准确率在目标检测领域受到关注,适用于自动驾驶、安防监控等场景。文中提供了源码和论文链接,以及详细的步骤说明,适合深度学习实践者参考。
615 0
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
2月前
|
机器学习/深度学习 并行计算 数据可视化
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用PaddleClas框架完成多标签分类任务,包括数据准备、环境搭建、模型训练、预测、评估等完整流程。
178 0
|
2月前
|
机器学习/深度学习 数据采集 算法
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
这篇博客文章介绍了如何使用包含多个网络和多种训练策略的框架来完成多目标分类任务,涵盖了从数据准备到训练、测试和部署的完整流程,并提供了相关代码和配置文件。
69 0
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
|
2月前
|
机器学习/深度学习 XML 并行计算
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用YOLOX完成图像目标检测任务的完整流程,包括数据准备、模型训练、验证和测试。
256 0
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
2月前
|
SQL 消息中间件 大数据
大数据-159 Apache Kylin 构建Cube 准备和测试数据(一)
大数据-159 Apache Kylin 构建Cube 准备和测试数据(一)
78 1
|
2月前
|
SQL 大数据 Apache
大数据-159 Apache Kylin 构建Cube 准备和测试数据(二)
大数据-159 Apache Kylin 构建Cube 准备和测试数据(二)
88 1