当前位置:编程学习 > C#/ASP.NET >>

|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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,