日期:2014-05-18  浏览次数:20452 次

2008年 最新海量数据分页
看了很多海量数据分页,大都都是单表的,而且当数据增大时效率下降但是排序的列不能有重复值,而在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 @PageIndex1=@PageIndex+1;
set @sqlRecordCount ='select @RecordCount=count(*) from ('+@sql+') mxf'
/*获取记录数*/
EXEC sp_executesql @sqlRecordCount,N'@RecordCount int OUTPUT',@RecordCount OUTPUT--计算总页数
SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize)
SET @sql='('+@sql+') h'
/* 基于SQL SERVER 2005 */
SET @sql=N'select SerialNumber,* from (select *,row_number() over (order by '+@OrderString+')'
+'as serialnumber from '+@sql+') 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
------解决方案--------------------
学习
------解决方案--------------------

海量数据的分页始终都是一个难题。
------解决方案--------------------
晕,我写的存储过程 可以不用
------解决方案--------------------
[u][/u]
探讨
学习

------解决方案--------------------
探讨

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

------解决方案--------------------
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) = '', --排序字段上一次页最大或最小值
-- 在@OrderValue不为空的情况下使用下面条件
@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