SQL Server 存储过程的分页方案比拼
CREATE?TABLE?[TestTable]?(
?[ID]?[int]?IDENTITY?(1,?1)?NOT?NULL?,
?[FirstName]?[nvarchar]?(100)?COLLATE?Chinese_PRC_CI_AS?NULL?,
?[LastName]?[nvarchar]?(100)?COLLATE?Chinese_PRC_CI_AS?NULL?,
?[Country]?[nvarchar]?(50)?COLLATE?Chinese_PRC_CI_AS?NULL?,
?[Note]?[nvarchar]?(2000)?COLLATE?Chinese_PRC_CI_AS?NULL?
)?ON?[PRIMARY]
GO
?
插入數據:(2萬條,用更多的數據測試會明顯一些)
SET?IDENTITY_INSERT?TestTable?ON
declare?@i?int
set?@i=1
while?@i<=20000
begin
????insert?into?TestTable([id],?FirstName,?LastName,?Country,Note)?values(@i,?'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
????set?@i=@i+1
end
SET?IDENTITY_INSERT?TestTable?OFF
?
-------------------------------------
分頁方案一:(利用Not?In和SELECT?TOP分頁)
語句形式:
SELECT?TOP?10?*
FROM?TestTable
WHERE?(ID?NOT?IN
??????????(SELECT?TOP?20?id
?????????FROM?TestTable
?????????ORDER?BY?id))
ORDER?BY?ID
SELECT?TOP?頁大小?*
FROM?TestTable
WHERE?(ID?NOT?IN
??????????(SELECT?TOP?頁大小*頁數?id
?????????FROM?表
?????????ORDER?BY?id))
ORDER?BY?ID
-------------------------------------
分頁方案二:(利用ID大于多少和SELECT?TOP分頁)
語句形式:
SELECT?TOP?10?*
FROM?TestTable
WHERE?(ID?>
??????????(SELECT?MAX(id)
?????????FROM?(SELECT?TOP?20?id
?????????????????FROM?TestTable
?????????????????ORDER?BY?id)?AS?T))
ORDER?BY?ID
SELECT?TOP?頁大小?*
FROM?TestTable
WHERE?(ID?>
??????????(SELECT?MAX(id)
?????????FROM?(SELECT?TOP?頁大小*頁數?id
?????????????????FROM?表
?????????????????ORDER?BY?id)?AS?T))
ORDER?BY?ID
-------------------------------------
分頁方案三:(利用SQL的游標存儲過程分頁)
create??procedure?XiaoZhengGe
@sqlstr?nvarchar(4000),?--查詢字符串
@currentpage?int,?--第N頁
@pagesize?int?--每頁行數
as
set?nocount?on
declare?@P1?int,?--P1是游標的id
?@rowcount?int
exec?sp_cursoropen?@P1?output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount?output
select?ceiling(1.0*@rowcount/@pagesize)?as?總頁數--,@rowcount?as?總行數,@currentpage?as?當前頁?
set?@currentpage=(@currentpage-1)*@pagesize+1
exec?sp_cursorfetch?@P1,16,@currentpage,@pagesize?
exec?sp_cursorclose?@P1
set?nocount?off
其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。
建議優化的時候,加上主鍵和索引,查詢效率會提高。
通過SQL?查詢分析器,顯示比較:我的結論是:
分頁方案二:(利用ID大于多少和SELECT?TOP分頁)效率最高,需要拼接SQL語句
分頁方案一:(利用Not?In和SELECT?TOP分頁)???效率次之,需要拼接SQL語句
分頁方案三:(利用SQL的游標存儲過程分頁)????效率最差,但是最為通用
總結
以上是生活随笔為你收集整理的SQL Server 存储过程的分页方案比拼的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个有苦说不出的个性签名。
- 下一篇: 不需xp_cmdshell支持在有注入漏