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

注:需求树立目录复制代码 代码如下:/*
经测量试验,在14483461条记下中询问第100000页,每页10条记下按升序和降序第二次时间均为0.47秒,首回时间均为0.43秒,测量检验语法如下:
execGetRecordFromPagenews,newsid,10,100000
news为表名,newsid为第一字段,使用时请先对newsid创立目录。 */ /*
函数名称:GetRecordFromPage 函数效率:获取钦点页的数据
参数表明:@tblName满含数据的表名 @fldName关键字段名 @PageSize每页记录数
@PageIndex要博取的页码 @OrderType排序类型,0-升序,1-降序
@strWhere查询条件(注意:不要加where卡塔尔国 作 者:铁拳 邮
箱:unjianhua_kki@sina.com”sunjianhua_kki@sina.com 创制时间:二〇〇二-07-04
改善时间:2003-07-04 */ CreatePROCEDUREGetRecordFromPage
@tblNamevarchar(255卡塔尔国,–表名 @fldNamevarchar(255卡塔尔国,–字段名
@PageSizeint=10,–页尺寸 @PageIndexint=1,–页码
@OrderTypebit=0,–设置排序类型,非0值则降序
@strWherevarchar(二零零零卡塔尔(قطر‎=”–查询条件(注意:不要加whereState of Qatar AS
declare@strSQLvarchar(6000卡塔尔(قطر‎–主语句
declare@strTmpvarchar(1000State of Qatar–临时变量
declare@strOrdervarchar(500卡塔尔–排序类型 if@OrderType!=0 begin
set@strTmp=”(selectmin” set@strOrder=”orderby[“+@fldName+”]desc” end
else begin set@strTmp=”(selectmax”
set@strOrder=”orderby[“+@fldName+”]asc” end
set@strSQL=”selecttop”+str(@PageSize)+”*from[”
+@tblName+”]where[“+@fldName+”]”+@strTmp+”([”
+@fldName+”])from(selecttop”+str((@PageIndex-1)*@PageSize)+”[”
+@fldName+”]from[“+@tblName+”]”+@strOrder+”)astblTmp)” +@strOrder
if@strWhere!=” set@strSQL=”selecttop”+str(@PageSize)+”*from[”
+@tblName+”]where[“+@fldName+”]”+@strTmp+”([”
+@fldName+”])from(selecttop”+str((@PageIndex-1)*@PageSize)+”[”
+@fldName+”]from[“+@tblName+”]where”+@strWhere+””
+@strOrder+”)astblTmp)and”+@strWhere+””+@strOrder if@PageIndex=1 begin
set@strTmp=”” if@strWhere!=” set@strTmp=”where(“+@strWhere+”)”
set@strSQL=”selecttop”+str(@PageSize)+”*from[”
+@tblName+”]”+@strTmp+””+@strOrder end exec(@strSQL) GO

原帖子如下:

图片 1图片 2/**//*
图片 3 名称:spAll_DeleteNoneUnique
图片 4 输入:要询问的表名和字段列表
图片 5 输出:
图片 6 调用:
图片 7 表达:实现相对级数据的分页显示!–能够在5秒内获得1448万条记下里的第1200页的100条记下,雄不?
图片 8 作者:铁拳
图片 9 邮件:
图片 10 网站:
图片 11 更新:20040610
图片 12 支持:
图片 13 版权:转述时请注明来源:精心想创制以往的Wellknow.net
图片 14*/
图片 15
图片 16CREATE PROCEDURE GetRecordFromPage
图片 17    @tblName      varchar(255),       — 表名
图片 18    @fldName      varchar(255),       — 字段名
图片 19    @PageSize     int = 10,           — 页尺寸
图片 20    @PageIndex    int = 1,            — 页码
图片 21    @IsCount      bit = 0,            — 重返记录总量, 非 0 值则赶回
图片 22    @OrderType    bit = 0,            — 设置排序类型, 非 0 值则降序
图片 23    @strWhere     varchar(1000卡塔尔国 = ”  — 查询条件 (注意: 不要加 where卡塔尔(قطر‎
图片 24AS
图片 25
图片 26declare @strSQL   varchar(6000)       — 主语句
图片 27declare @strTmp   varchar(100卡塔尔国        — 一时变量
图片 28declare @strOrder varchar(400卡塔尔(قطر‎        — 排序类型
图片 29
图片 30if @OrderType != 0
图片 31begin
图片 32    set @strTmp = “<(select min”
图片 33    set @strOrder = ” order by [” + @fldName +”] desc”
图片 34end
图片 35else
图片 36begin
图片 37    set @strTmp = “>(select max”
图片 38    set @strOrder = ” order by [” + @fldName +”] asc”
图片 39end
图片 40
图片 41set @strSQL = “select top ” + str(@PageSize) + ” * from [“
图片 42    + @tblName + “] where [” + @fldName + “]” + @strTmp + “([“
图片 43    + @fldName + “]) from (select top ” + str((@PageIndex-1)*@PageSize) + ” [“
图片 44    + @fldName + “] from [” + @tblName + “]” + @strOrder + “) as tblTmp)”
图片 45    + @strOrder
图片 46
图片 47if @strWhere != ”
图片 48    set @strSQL = “select top ” + str(@PageSize) + ” * from [“
图片 49        + @tblName + “] where [” + @fldName + “]” + @strTmp + “([“
图片 50        + @fldName + “]) from (select top ” + str((@PageIndex-1)*@PageSize) + ” [“
图片 51        + @fldName + “] from [” + @tblName + “] where ” + @strWhere + ” “
图片 52        + @strOrder + “) as tblTmp) and ” + @strWhere + ” ” + @strOrder
图片 53
图片 54if @PageIndex = 1
图片 55begin
图片 56    set @strTmp = “”
图片 57    if @strWhere != ”
图片 58        set @strTmp = ” where ” + @strWhere
图片 59
图片 60    set @strSQL = “select top ” + str(@PageSize) + ” * from [“
图片 61        + @tblName + “]” + @strTmp + ” ” + @strOrder
图片 62end
图片 63
图片 64if @IsCount != 0
图片 65    set @strSQL = “select count(*) as Total from [” + @tblName + “]”
图片 66
图片 67exec (@strSQL)
图片 68
图片 69GO
图片 70
图片 71

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

图片 72更改一小点平价别的人使用 
图片 73CREATE PROCEDURE GetRecordFromPage 
图片 74@tblName varchar(255), — 表名 
图片 75@fldName varchar(255), — 字段名 
图片 76@OrderfldName varchar(255卡塔尔国, — 排序字段名 
图片 77@StatfldName varchar(255卡塔尔, — 总计字段名 
图片 78@PageSize int = 10, — 页尺寸 
图片 79@PageIndex int = 1, — 页码 
图片 80@IsCount bit = 0, — 再次回到记录总量, 非 0 值则赶回 
图片 81@OrderType bit = 0, — 设置排序类型, 非 0 值则降序 
图片 82@strWhere varchar(1000State of Qatar = ” — 查询条件 (注意: 不要加 where卡塔尔国 
图片 83AS 
图片 84
图片 85declare @strSQL varchar(6000) — 主语句 
图片 86declare @strTmp varchar(100卡塔尔(قطر‎ — 有的时候变量 
图片 87declare @strOrder varchar(400State of Qatar — 排序类型 
图片 88
图片 89if @OrderType != 0 
图片 90begin 
图片 91set @strTmp = “<(select min” 
图片 92set @strOrder = ” order by [” + @OrderfldName +”] desc” 
图片 93end 
图片 94else 
图片 95begin 
图片 96set @strTmp = “>(select max” 
图片 97set @strOrder = ” order by [” + @OrderfldName +”] asc” 
图片 98end 
图片 99
图片 100set @strSQL = “select top ” + str(@PageSize) + ” ” + @fldName + ” from [” 
图片 101+ @tblName + “] where [” + @OrderfldName + “]” + @strTmp + “([” 
图片 102+ @OrderfldName + “]) from (select top ” + str((@PageIndex-1)*@PageSize) + ” [” 
图片 103+ @OrderfldName + “] from [” + @tblName + “]” + @strOrder + “) as tblTmp)” 
图片 104+ @strOrder 
图片 105
图片 106if @strWhere != ” 
图片 107set @strSQL = “select top ” + str(@PageSize) + ” ” + @fldName + ” from [” 
图片 108+ @tblName + “] where [” + @OrderfldName + “]” + @strTmp + “([” 
图片 109+ @OrderfldName + “]) from (select top ” + str((@PageIndex-1)*@PageSize) + ” [” 
图片 110+ @OrderfldName + “] from [” + @tblName + “] where ” + @strWhere + ” ” 
图片 111+ @strOrder + “) as tblTmp) and ” + @strWhere + ” ” + @strOrder 
图片 112
图片 113if @PageIndex = 1 
图片 114begin 
图片 115set @strTmp = “” 
图片 116if @strWhere != ” 
图片 117set @strTmp = ” where ” + @strWhere 
图片 118
图片 119set @strSQL = “select top ” + str(@PageSize) + ” ” + @fldName + ” from [” 
图片 120+ @tblName + “]” + @strTmp + ” ” + @strOrder 
图片 121end 
图片 122
图片 123if @IsCount != 0 
图片 124set @strSQL = “select count(” + @StatfldName + “) as Total from [” + @tblName + “]” 
图片 125
图片 126exec (@strSQL) 
图片 127
图片 128GO 
图片 129

说明:
追加了上面几个部分,别的人拷贝去可依附自身须求开展设定。
@OrderfldName varchar(255卡塔尔国, — 排序字段名
@StatfldName varchar(255卡塔尔, — 总括字段名

fldName功用由排序转换为操纵要求开采的字段。
@fldName varchar(255), — 字段名

----------------------------------------------
民用测量检验结果:
经过测量检验,品质并从未原帖子所说的好。但那大概是机器原因,要明了,在SQL
Server中,2千万条空记录大约要并吞3G左右的空间,而插入那2千万条记下,在本身的测验平台上开销了近十三个钟头,内部存款和储蓄器占用从125M升高到350M左右。小编骨子里测量检验了一下,在建设构造目录的状态下,推行二次依据主键,重临一条记下的询问,在512M内部存款和储蓄器,2.2G
CPU,20G单分区存款和储蓄数据库文件,100M局域网的配置情状下,平均大致需求15s左右(那只是自己的村办测验,不持有任何实质性意义。)。

除此以外小编意识,对于上述配置的机械,运行SQL
Server时,在百万品级之下的表中实行查询--(索引卓绝,未有坏点,也许最新索引),速度差异十分小,但达到8位数以上,也正是相对之上时候,SQL
Server表现就不太好了,当然,那与机器配置有非常大关系了。但确实无疑,SQL
Server 
二〇〇一还不是公司级数据库的精品选项,在Oracle实践近似的查询,质量要好于SQL
Server。插入实践完结的时日是4个钟头,内部存款和储蓄器占用一贯未有成形:400M。实行相仿查询,必要的光阴是10s左右。

二弟这几天辛劳叁个公积金项目,对于部门数据库、核心数据库的调节进行了一些评估,Oracle软件+SUN/HP的硬件还是占了中华夏族民共和国政党部门服务器的许多市道,再正是IBM,私吞了高级和甚高等的大部分作业。

微软在此上头打个胜仗,还会有十分长的路要走--个人感觉,和硬件集团合作研究开发相称套硬件是不二主意。

发表评论

电子邮件地址不会被公开。 必填项已用*标注