zl程序教程

您现在的位置是:首页 >  后端

当前栏目

SQLSERVER2008中三种分页方法与比较

方法 比较 分页 三种 sqlserver2008
2023-06-13 09:14:49 时间

建立表:

复制代码代码如下:

CREATETABLE[TestTable](
 [ID][int]IDENTITY(1,1)NOTNULL,
 [FirstName][nvarchar](100)COLLATEChinese_PRC_CI_ASNULL,
 [LastName][nvarchar](100)COLLATEChinese_PRC_CI_ASNULL,
 [Country][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL,
 [Note][nvarchar](2000)COLLATEChinese_PRC_CI_ASNULL
)ON[PRIMARY]
GO

插入数据:(2万条,用更多的数据测试会明显一些)
SETIDENTITY_INSERTTestTableON
declare@iint
set@i=1
while@i<=20000
begin
   insertintoTestTable([id],FirstName,LastName,Country,Note)values(@i,"FirstName_XXX","LastName_XXX","Country_XXX","Note_XXX")
   set@i=@i+1
end
SETIDENTITY_INSERTTestTableOFF

分页方案一:(利用NotIn和SELECTTOP分页)

语句形式:

复制代码代码如下:

SELECTTOP10*
FROMTestTable
WHERE(IDNOTIN
         (SELECTTOP20id
        FROMTestTable
        ORDERBYid))
ORDERBYID

SELECTTOP页大小*
FROMTestTable
WHERE(IDNOTIN
         (SELECTTOP页大小*页数id
        FROM表
        ORDERBYid))
ORDERBYID

分页方案二:(利用ID大于多少和SELECTTOP分页)
语句形式:

复制代码代码如下:
SELECTTOP10*
FROMTestTable
WHERE(ID>
         (SELECTMAX(id)
        FROM(SELECTTOP20id
                FROMTestTable
                ORDERBYid)AST))
ORDERBYID

SELECTTOP页大小*
FROMTestTable
WHERE(ID>
         (SELECTMAX(id)
        FROM(SELECTTOP页大小*页数id
                FROM表
                ORDERBYid)AST))
ORDERBYID

分页方案三:(利用SQL的游标存储过程分页)

复制代码代码如下:
create procedureXiaoZhengGe
@sqlstrnvarchar(4000),--查询字符串
@currentpageint,--第N页
@pagesizeint--每页行数
as
setnocounton
declare@P1int,--P1是游标的id
 @rowcountint
execsp_cursoropen@P1output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcountoutput
selectceiling(1.0*@rowcount/@pagesize)as总页数--,@rowcountas总行数,@currentpageas当前页
set@currentpage=(@currentpage-1)*@pagesize+1
execsp_cursorfetch@P1,16,@currentpage,@pagesize
execsp_cursorclose@P1
setnocountoff

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECTTOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用NotIn和SELECTTOP分页)  效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页)   效率最差,但是最为通用
在实际情况中,要具体分析。