三種SQL分頁(yè)法效率分析

字號(hào):

表中主鍵必須為標(biāo)識(shí)列,[ID] int IDENTITY (1,1)
    1.分頁(yè)方案一:(利用Not In和SELECT 分頁(yè))
    語(yǔ)句形式:
    SELECT10*
    FROMTestTable
    WHERE(IDNOTIN
    (SELECT20id
     FROMTestTable
     ORDERBYid))
    ORDERBYID
    SELECT頁(yè)大小*
    FROMTestTable
    WHERE(IDNOTIN
    (SELECT頁(yè)大小*頁(yè)數(shù)id
     FROM表
     ORDERBYid))
    ORDERBYID
    2.分頁(yè)方案二:(利用ID大于多少和SELECT 分頁(yè))
    語(yǔ)句形式:
     SELECT10*
    FROMTestTable
    WHERE(ID>
    (SELECTMAX(id)
     FROM(SELECT20id
       FROMTestTable
       ORDERBYid)AST))
    ORDERBYID
    SELECT頁(yè)大小*
    FROMTestTable
    WHERE(ID>
    (SELECTMAX(id)
     FROM(SELECT頁(yè)大小*頁(yè)數(shù)id
       FROM表
       ORDERBYid)AST))
    ORDERBYID
    3.分頁(yè)方案三:(利用SQL的游標(biāo)存儲(chǔ)過(guò)程分頁(yè))
    create procedureSqlPager
    @sqlstrnvarchar(4000),--查詢字符串
    @currentpageint,--第N頁(yè)
    @pagesizeint--每頁(yè)行數(shù)
    as
    setnocounton
    declare@P1int,--P1是游標(biāo)的id
    @rowcountint
    execsp_cursoropen@P1output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcountoutput
    selectceiling(1.0*@rowcount/@pagesize)as總頁(yè)數(shù)--,@rowcountas總行數(shù),@currentpageas當(dāng)前頁(yè)
    set@currentpage=(@currentpage-1)*@pagesize+1
    execsp_cursorfetch@P1,16,@currentpage,@pagesize
    execsp_cursorclose@P1
    setnocountoff
    其它的方案:如果沒(méi)有主鍵,可以用臨時(shí)表,也可以用方案三做,但是效率會(huì)低。
    建議優(yōu)化的時(shí)候,加上主鍵和索引,查詢效率會(huì)提高。
    通過(guò)SQL 查詢分析器,顯示比較:我的結(jié)論是:
    分頁(yè)方案二:(利用ID大于多少和SELECT 分頁(yè))效率,需要拼接SQL語(yǔ)句
    分頁(yè)方案一:(利用Not In和SELECT 分頁(yè)) 效率次之,需要拼接SQL語(yǔ)句
    分頁(yè)方案三:(利用SQL的游標(biāo)存儲(chǔ)過(guò)程分頁(yè)) 效率最差,但是最為通用