好贷网好贷款

2008年 最新海量数据分页 20fredrickhu]

发布时间:2016-12-4 16:23:33 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"2008年 最新海量数据分页 20fredrickhu]",主要涉及到2008年 最新海量数据分页 20fredrickhu]方面的内容,对于2008年 最新海量数据分页 20fredrickhu]感兴趣的同学可以参考一下。

看了很多海量数据分页,大都都是单表的,而且当数据增大时效率下降但是排序的列不能有重复值,而在sql 2005 里通过 OVER子句可以解决,不过它也只是在后台把查询结果加一列,然后所有数据查一遍,每条记录插入序号,当有上千万数据时效率也是有点低的。 所以我归纳了下,如果排序的列有重复,就用sql2005 的存储过程,否则用我写的存储过程 sql 2005的存储过程: create PROCEDURE [dbo].[SP_Common_PageChange] @sql nvarchar(4000), --sql字符串 @OrderString nvarchar(100), @PageIndex int, @PageSize int, @RecordCount int OUT, @PageCount int OUT AS /*计算页面数据*/ Declare @PageIndex1 int declare @sqlRecordCount nvarchar(4000) Set @[email protected]+1; set @sqlRecordCount ='select @RecordCount=count(*) from ([email protected]+') mxf' /*获取记录数*/ EXEC sp_executesql @sqlRecordCount,[email protected] int OUTPUT',@RecordCount OUTPUT--计算总页数 SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize) SET @sql='([email protected]+') h' /* 基于SQL SERVER 2005 */ SET @sql=N'select SerialNumber,* from (select *,row_number() over (order by [email protected]+')' +'as serialnumber from [email protected]+') as T  where T.SerialNumber > ( '+convert(nvarchar(100),@PageIndex)+' * '+ convert(nvarchar(100),@PageSize)+' ) and' +' T.SerialNumber <= ( '+convert(nvarchar(100),@PageIndex1)+' * '+convert(nvarchar(100),@PageSize)+' )' EXEC (@sql) 本人写的存储过程: 请查看 http://new.qzone.qq.com/34065028

MARK.

不过怎么说  取900到1000条数据 始终是要取前1000条的

关注,学习!

mar

学习

海量数据的分页始终都是一个难题。

晕,我写的存储过程 可以不用

引用 2 楼 rucypli 的回复:不过怎么说  取900到1000条数据 始终是要取前1000条的 我写的不用。

引用 5 楼 happyflystone 的回复:学习 。。

引用 6 楼 Garnett_KG 的回复:海量数据的分页始终都是一个难题。 在sql2005 前 排序列不能有重复值,。我没有用sql2005 特有的函数,所以我也没有解决这个难题。。其他都解决了。 sql2005 虽然排序列 可以有重复值,但是数据多了,比如千万条,上亿条 ,就慢了。 

learn

本人写的存储过程: 由于比通用的改进了一些,所以要复杂些。。 set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- 多表之间用逗号分开, 条件不带where 但是 要加括号确保万一 -- 多表一定要带条件,如果是单表字段前可不加表,排序字段不可有重复列 Create procedure [dbo].[USP_DWX_SqlDataPaging] @tbNameS varchar(255),        --表名 @tbFields varchar(1000),      --返回字段 字段前加所属表, @OrderField varchar(255),     --排序的字段名,此字段不能有重复值 前面不用加表 @PageSize int,                 --页尺寸 @PageIndex int,                --页码 0 or 1 表示 首页, -1 表示尾页 @OrderType bit,                --排序类型,1是升序,0是降序 @strWhere varchar(1500),       --  查询条件 字段前加所属表, @Total int output ,           --返回总记录数 @OrderValue varchar(20) = '',   --排序字段上一次页最大或最小值 -- [email protected] @OrderFieldType char(1) = 'S',   --排序字段类型,"S" 字符串,"I" 整型 @PageDirection bit = 1              --点击页的方向,1是下一页,0是上一页 as declare @strSql varchar(5000)     --主语句 declare @strOrder varchar(200)    --排序 declare @strSqlCount nvarchar(500)--查询记录总数主语句 declare @strtemp varchar(500)      --排序附加语句 declare @strWhereSql varchar(200)  --带where 条件 declare @strOrderIn varchar(200)    --内查询排序 if RTRIM(LTRIM(@strWhere)) !=''    set @strWhereSql = ' where '+ @strWhere else   set @strWhereSql = '' --------------总记录数--------------- set @strSqlCount='Select @TotalCout=count(*) from  ' + @tbNameS + @strWhereSql --------------排序-----------------0是降序,1未升序 set @Total=0  set @strOrderIn = '' if @OrderType !=0 begin   set @strOrder='order by ' + @OrderField + ' asc ' end else begin   set @strOrder='order by '+ @OrderField + ' desc' end if RTRIM(LTRIM(@OrderValue)) = '' --传统分页 begin --   -- 去掉前面的表 --   declare @tmpOrderField varchar(255) --   set @tmpOrderField = @OrderField --   set @tmpOrderField = REVERSE(@tmpOrderField); --   set @tmpOrderField = SUBSTRING(@tmpOrderField,0,CHARINDEX('.',@tmpOrderField)) --   set @tmpOrderField = REVERSE(@tmpOrderField);   if @OrderType !=0   begin     set @strtemp= '>(select max(' + ' ' [email protected]+ ') from (select top '                   +str((@PageIndex-1)[email protected]) + ' [email protected] +' from [email protected]                   + @strWhereSql+ ' '+ @strOrder +') as tb)'   end   else   begin     set @strtemp= '<(select min('+ ' ' [email protected]+ ') from (select top '                   +str((@PageIndex-1)[email protected]) + ' [email protected] +' from [email protected]                   + @strWhereSql+ ' '+ @strOrder +') as tb)'   end    end else begin  -- 根据 提供的比较值   declare @oper char(3)    set @oper = ''   if @PageDirection = 1   begin     if @OrderType != 0 --  desc 降序     begin       set @oper = ' > '     end     else       set @oper = ' < '   end   else   begin     if @OrderType !=0 --  desc 降序     begin       set @oper = ' < '       set @strOrderin = 'order by ' + @OrderField + ' desc '     end     else     begin       set @oper = ' > '       set @strOrderin = 'order by ' + @OrderField + ' asc '     end   end;   if @OrderFieldType = 'S'   begin     set @strtemp= @oper + +''''+ @OrderValue +'''';   end   else     set @strtemp= @oper + @OrderValue--cast(@OrderValue as int);    end --------------分页为第一页------------ if @PageIndex =1 or @PageIndex =0 begin   set @PageIndex =1   set @strSql = 'Select top ' +str(@PageSize)+ ' ' + @tbFields + '  from '+ @tbNameS + @strWhereSql+ ' ' + @strOrder end else if @PageIndex = -1    --最后一页 begin   if @OrderType !=0   begin     set @strOrderIn='order by ' + @OrderField + ' desc '   end   else   begin     set @strOrderIn='order by '+ @OrderField + ' asc'   end      set @strSql = 'Select top ' +str(@PageSize)+ ' ' + @tbFields + '  from '+ @tbNameS + @strWhereSql + ' ' + @strOrderIn   set @strSql = 'Select * from (' + @strSql + ' ) t '+ @strOrder; end else  begin   declare @temp varchar(200)   set @temp = ''   if RTRIM(LTRIM(@strWhere)) != ''     set @temp = ' and ' + @strWhere      if if RTRIM(LTRIM(@OrderValue)) = ''     set @strSql = 'Select top ' +str(@PageSize) + ' ' + @tbFields                                +' from ' + @tbNameS + ' where [email protected] +' '                               + @strtemp + ' ' + @temp + @strOrder   else   begin     set @strSql = 'Select top ' +str(@PageSize) + ' ' + @tbFields                                +' from ' + @tbNameS + ' where [email protected] +' '                               + @strtemp + ' ' + @temp + @strOrderIn     set @strSql = 'select * from(' + @strSql + ') tb ' + @strOrder   end end exec sp_executesql @strSqlCount,[email protected] int output',@Total output exec(@strSql)

@OrderValue varchar(20) = '',  --排序字段上一次页最大或最小值 当  @OrderValue 不为空时,查询900到1000的数据 不用查询前900条,[email protected] 

我个人不喜欢所谓“通用”的分页存储过程 分页需要通盘考虑取出来的字段的类型,排序字段是否可以保证唯一。你做的优化前提之一就是要有唯一的排序字段,结合业务逻辑考虑,这个排序字段可能包含多个,[email protected]? 我认为分页存储过程只应该有一个通用的写法. 有唯一排序字段,该怎么写/没有唯一排序字段,该怎么写. 类似这样

再也不要写什么千万级的分页存储过程. 客户需要的内容 最好确定在一页 或者 几页. 几千万条数据分页展现给用户,你想他在里面淘金啊.

引用 15 楼 QQ832198 的回复:再也不要写什么千万级的分页存储过程. 客户需要的内容 最好确定在一页 或者 几页. 几千万条数据分页展现给用户,你想他在里面淘金啊. 哈哈

学习

学习!

rownumber

正需要这个,关注

传说中05的row_number

路过:(

row_number的性能不知道怎么样

我是学生,我们书上说各大数据库厂商都提供了分页技术,sqlserver是这样的 select * from( select top N* from( select top (M+N-1)* from 表名称)t1)t2 不过我实验过不行 希望高手指点

上面是说从表中第M行开始,查询N条记录

上一篇:SQL Server 2005分区表性能问题及分区原则 100pgy8288]
下一篇:SQLSERVER2008自动提示有问题 10netcup]

相关文章

相关评论