|M| 300分 麻烦大家贴出您现在用的SQL分页存储程按主键排序和按非字键排序 再说说性能怎么样 发者有分 谢谢
因为现在接一下个项目他的表有200W条数据我用fill DataSet
全过来的话 我的机子就重启了
所以在这里想收集一下大家所使用的SQL存储过程
希望大家能够支持
谢谢 --------------------编程问答-------------------- 我不用数据库,大数据量一般用lucene --------------------编程问答-------------------- 用临时表分页的存储过程:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SplistPageTest]
@pagesize int,
@pageindex int,
@docount bit
AS
/*
前台一般是一个返回就当一个结果集, 不管这个返回是结果集, 还是操作的反馈信息.
为了保证前台得到的只是真实的记录集, 而不是反馈信息, 因此得使用 set nocount on
*/
--set nocount on
if(@docount=1)
select count(id) from test01
else
begin
declare @indextable table(id int identity(1,1),nid int) /*在此声明一个内存表,identity设置自动增长字段,步长为1*/
declare @PageLowerBound int
declare @PageUpperBound int
set @PageLowerBound=(@pageindex-1)*@pagesize
set @PageUpperBound=@PageLowerBound+@pagesize
--set rowcount @PageUpperBound /*rowcount截至返回的行数*/
insert into @indextable(nid) select id from test01 order by id asc
select O.id,O.name from test01 O,@indextable t where O.id=t.nid
and t.id>@PageLowerBound and t.id<=@PageUpperBound
end
--set nocount off
效率还可以
还有一种:
调用:
EXEC spAll_ReturnRows 'SELECT * FROM 表名', 页号, 返回记录数, '主键', '排序字段'
spAll_ReturnRows 'SELECT * FROM all_Categories',2,10,'[ID]','[ID]'
说明:[百万级]通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录
*/
CREATE PROCEDURE dbo.spAll_ReturnRows
(
@SQL nVARCHAR(4000),
@Page int,
@RecsPerPage int,
@ID VARCHAR(255),
@Sort VARCHAR(255)
)
AS
DECLARE @Str nVARCHAR(4000)
SET @Str='SELECT TOP '+CAST(@RecsPerPage AS VARCHAR(20))+' * FROM ('+@SQL+') T WHERE T.'+@ID+' NOT IN
(SELECT TOP '+CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+' '+@ID+' FROM ('+@SQL+') T9 ORDER BY '+@Sort+') ORDER BY '+@Sort
PRINT @Str
EXEC sp_ExecuteSql @Str
GO
/*
名称:spAll_DeleteNoneUnique
输入:要查询的表名和字段列表
输出:
调用:
说明:实现千万级数据的分页显示!--可以在5秒内获取1448万条记录里的第1200页的100条记录,雄不?
*/
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
--------------------编程问答-------------------- study --------------------编程问答-------------------- 学习..
关注.. --------------------编程问答-------------------- RE:michael_sw
----------------
这个是不是您现在所用的存储过程啊
PS:是自已现在用的 不是网上的
谢谢 --------------------编程问答-------------------- UP --------------------编程问答-------------------- 接分
补充:.NET技术 , ASP.NET