海量数据存储过程分页

当数据量很大时,程序员就会面临数据的检索问题,以WEB程序为例,如果使用.NET? DataGrid自带的分页功能显然时不行的,如果将数据一次性从数据库取出来会占据很大的内存,机器也受不了.唯一的办法是每次只检索出部分数据(每页的数据量),那就需要一个通用的,而且性能很好的分页方法,所以选择存储过程分页,CSDN上有网友发布了一个有关分页的存储过程,感觉很实用,稍微修改了一下.

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO


-- 获取指定页的数据

ALTER???????? PROCEDURE sp_pagination

@tblName?? varchar(255),?????? -- 表名

@strGetFields varchar(1000) = '*',? -- 需要返回的列

@fldName varchar(255)='',????? -- 排序的字段名

@PageSize?? int = 10,????????? -- 页尺寸

@PageIndex? int = 1,?????????? -- 页码

@OrderType bit = 0,? -- 设置排序类型, 非 0 值则降序

@strWhere? varchar(1500) = ''? -- 查询条件 (注意: 不要加 where)

@doCount? int = 0 out,?? -- 返回记录总数, 非 0 值则返回

AS

declare @strSQL?? varchar(5000)?????? -- 主语句

declare @strTmp?? varchar(110)??????? -- 临时变量

declare @strOrder varchar(400)??????? -- 排序类型

?


if @OrderType != 0

begin

??? set @strTmp = "<(select min"

set @strOrder = " order by [" + @fldName +"] desc"

--如果@OrderType不是0,就执行降序,这句很重要!

end

else

begin

??? set @strTmp = ">(select max"

??? set @strOrder = " order by [" + @fldName +"] asc"

end

?

if @PageIndex = 1

begin

??? if @strWhere != ''??

??? set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "? from [" + @tblName + "] where " + @strWhere + " " + @strOrder

???? else

???? set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "? from ["+ @tblName + "] "+ @strOrder

--如果是第一页就执行以上代码,这样会加快执行速度

end

else

begin

--以下代码赋予了@strSQL以真正执行的SQL代码

set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "? 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) +" "+@strGetFields+ "? from ["

??????? + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["

??????? + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["

??????? + @fldName + "] from [" + @tblName + "] where " + @strWhere + " "

??????? + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder

end

--end??
--以下代码的意思是执行总数@doCount统计。

?

??? if @strWhere !=''

??? set @strSQL = @strSQL+" select count("+@fldName+") as _Total from [" + @tblName + "] where "+@strWhere

??? else

??? set @strSQL = @strSQL+" select count("+@fldName+") as _Total from [" + @tblName + "]"

--else

--begin
--print @strSQL
exec (@strSQL)

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

注:

当我用70万条数据进行测试时,发现SQLServer占据了130M多的内存,吓我一跳,后来我将统计总数的代码注释掉,发现只占30多M的内存,可见是统计总数的代码占据了那么多的内存,可是什么原因呢,原来是我没有建立索引,等我建立索引后发现,内存消耗降低到了40M以下,还算稳定,索引对海量数据检索的作用可见一斑,所以当你的数据量很大时,别忘了建立索引.

?

posted @ 2005-04-18 05:19  meteorcui  阅读(260)  评论(0编辑  收藏  举报