日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

SQL Server 存儲過程的分頁方案比拼

系統 2044 0

轉自: http://blog.csdn.net/lihonggen0/archive/2004/09/14/103511.aspx

1 SQLServer存儲過程的分頁,這個問題已經討論過幾年了,很多朋友在問我,所以在此發表一下我的觀點
2 建立表:
3
4 CREATE TABLE [ TestTable ] (
5 [ ID ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL ,
6 [ FirstName ] [ nvarchar ] ( 100 )COLLATEChinese_PRC_CI_AS NULL ,
7 [ LastName ] [ nvarchar ] ( 100 )COLLATEChinese_PRC_CI_AS NULL ,
8 [ Country ] [ nvarchar ] ( 50 )COLLATEChinese_PRC_CI_AS NULL ,
9 [ Note ] [ nvarchar ] ( 2000 )COLLATEChinese_PRC_CI_AS NULL
10 ) ON [ PRIMARY ]
11 GO
12
13
14
15 插入數據:(2萬條,用更多的數據測試會明顯一些)
16 SET IDENTITY_INSERT TestTable ON
17
18 declare @i int
19 set @i = 1
20 while @i <= 20000
21 begin
22 insert into TestTable( [ id ] ,FirstName,LastName,Country,Note) values ( @i , ' FirstName_XXX ' , ' LastName_XXX ' , ' Country_XXX ' , ' Note_XXX ' )
23 set @i = @i + 1
24 end
25
26 SET IDENTITY_INSERT TestTable OFF
27
28
29
30 -- -----------------------------------
31
32 分頁方案一:(利用NotIn和SELECTTOP分頁)
33 語句形式:
34 SELECT TOP 10 *
35 FROM TestTable
36 WHERE (ID NOT IN
37 ( SELECT TOP 20 id
38 FROM TestTable
39 ORDER BY id))
40 ORDER BY ID
41
42
43 SELECT TOP 頁大小 *
44 FROM TestTable
45 WHERE (ID NOT IN
46 ( SELECT TOP 頁大小 * 頁數id
47 FROM
48 ORDER BY id))
49 ORDER BY ID
50
51 -- -----------------------------------
52
53 分頁方案二:(利用ID大于多少和SELECTTOP分頁)
54 語句形式:
55 SELECT TOP 10 *
56 FROM TestTable
57 WHERE (ID >
58 ( SELECT MAX (id)
59 FROM ( SELECT TOP 20 id
60 FROM TestTable
61 ORDER BY id) AS T))
62 ORDER BY ID
63
64
65 SELECT TOP 頁大小 *
66 FROM TestTable
67 WHERE (ID >
68 ( SELECT MAX (id)
69 FROM ( SELECT TOP 頁大小 * 頁數id
70 FROM
71 ORDER BY id) AS T))
72 ORDER BY ID
73
74
75 -- -----------------------------------
76
77 分頁方案三:(利用SQL的游標存儲過程分頁)
78 create procedure XiaoZhengGe
79 @sqlstr nvarchar ( 4000 ), -- 查詢字符串
80 @currentpage int , -- 第N頁
81 @pagesize int -- 每頁行數
82 as
83 set nocount on
84 declare @P1 int , -- P1是游標的id
85 @rowcount int
86 exec sp_cursoropen @P1 output, @sqlstr , @scrollopt = 1 , @ccopt = 1 , @rowcount = @rowcount output
87 select ceiling ( 1.0 * @rowcount / @pagesize ) as 總頁數 -- ,@rowcountas總行數,@currentpageas當前頁
88 set @currentpage = ( @currentpage - 1 ) * @pagesize + 1
89 exec sp_cursorfetch @P1 , 16 , @currentpage , @pagesize
90 exec sp_cursorclose @P1
91 set nocount off
92
93 其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。
94 建議優化的時候,加上主鍵和索引,查詢效率會提高。
95
96 通過SQL查詢分析器,顯示比較:我的結論是:
97 分頁方案二:(利用ID大于多少和SELECTTOP分頁)效率最高,需要拼接SQL語句
98 分頁方案一:(利用NotIn和SELECTTOP分頁)效率次之,需要拼接SQL語句
99 分頁方案三:(利用SQL的游標存儲過程分頁)效率最差,但是最為通用
100
101 在實際情況中,要具體分析。


更多的討論見:
http://community.csdn.net/Expert/topic/3292/3292678.xml?temp=.1621515

轉自: http://blog.csdn.net/lihonggen0/archive/2004/09/14/103511.aspx

SQL Server 存儲過程的分頁方案比拼


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 洱源县| 安康市| 祥云县| 双辽市| 观塘区| 潜山县| 聂拉木县| 若尔盖县| 邢台市| 社旗县| 和平县| 梅河口市| 竹溪县| 文昌市| 太仓市| 深圳市| 泰来县| 杭锦后旗| 武汉市| 富川| 皋兰县| 廊坊市| 蚌埠市| 浏阳市| 广南县| 天门市| 吐鲁番市| 普格县| 崇礼县| 衡东县| 盐山县| 林周县| 博湖县| 娱乐| 读书| 商河县| 剑河县| 文登市| 淳化县| 郸城县| 贵南县|