表中主鍵必須為標(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è)) 效率最差,但是最為通用
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è)) 效率最差,但是最為通用

