日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

SQL Server 存储过程的分页方案比拼

發布時間:2023/11/27 生活经验 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 存储过程的分页方案比拼的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。