SQL Server 存儲(chǔ)過(guò)程的分頁(yè)
更新時(shí)間:2006年08月18日 00:00:00 作者:
建立表:
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
插入數(shù)據(jù):(2萬(wàn)條,用更多的數(shù)據(jù)測(cè)試會(huì)明顯一些)
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
-------------------------------------
分頁(yè)方案一:(利用Not In和SELECT TOP分頁(yè))
語(yǔ)句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID
SELECT TOP 頁(yè)大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 頁(yè)大小*頁(yè)數(shù) id
FROM 表
ORDER BY id))
ORDER BY ID
-------------------------------------
分頁(yè)方案二:(利用ID大于多少和SELECT TOP分頁(yè))
語(yǔ)句形式:
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 頁(yè)大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 頁(yè)大小*頁(yè)數(shù) id
FROM 表
ORDER BY id) AS T))
ORDER BY ID
-------------------------------------
分頁(yè)方案三:(利用SQL的游標(biāo)存儲(chǔ)過(guò)程分頁(yè))
create procedure XiaoZhengGe
@sqlstr nvarchar(4000), --查詢(xún)字符串
@currentpage int, --第N頁(yè)
@pagesize int --每頁(yè)行數(shù)
as
set nocount on
declare @P1 int, --P1是游標(biāo)的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 總頁(yè)數(shù)--,@rowcount as 總行數(shù),@currentpage as 當(dāng)前頁(yè)
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
其它的方案:如果沒(méi)有主鍵,可以用臨時(shí)表,也可以用方案三做,但是效率會(huì)低。
建議優(yōu)化的時(shí)候,加上主鍵和索引,查詢(xún)效率會(huì)提高。
通過(guò)SQL 查詢(xún)分析器,顯示比較:我的結(jié)論是:
分頁(yè)方案二:(利用ID大于多少和SELECT TOP分頁(yè))效率最高,需要拼接SQL語(yǔ)句
分頁(yè)方案一:(利用Not In和SELECT TOP分頁(yè)) 效率次之,需要拼接SQL語(yǔ)句
分頁(yè)方案三:(利用SQL的游標(biāo)存儲(chǔ)過(guò)程分頁(yè)) 效率最差,但是最為通用
在實(shí)際情況中,要具體分析。
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
插入數(shù)據(jù):(2萬(wàn)條,用更多的數(shù)據(jù)測(cè)試會(huì)明顯一些)
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
-------------------------------------
分頁(yè)方案一:(利用Not In和SELECT TOP分頁(yè))
語(yǔ)句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID
SELECT TOP 頁(yè)大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 頁(yè)大小*頁(yè)數(shù) id
FROM 表
ORDER BY id))
ORDER BY ID
-------------------------------------
分頁(yè)方案二:(利用ID大于多少和SELECT TOP分頁(yè))
語(yǔ)句形式:
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 頁(yè)大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 頁(yè)大小*頁(yè)數(shù) id
FROM 表
ORDER BY id) AS T))
ORDER BY ID
-------------------------------------
分頁(yè)方案三:(利用SQL的游標(biāo)存儲(chǔ)過(guò)程分頁(yè))
create procedure XiaoZhengGe
@sqlstr nvarchar(4000), --查詢(xún)字符串
@currentpage int, --第N頁(yè)
@pagesize int --每頁(yè)行數(shù)
as
set nocount on
declare @P1 int, --P1是游標(biāo)的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 總頁(yè)數(shù)--,@rowcount as 總行數(shù),@currentpage as 當(dāng)前頁(yè)
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
其它的方案:如果沒(méi)有主鍵,可以用臨時(shí)表,也可以用方案三做,但是效率會(huì)低。
建議優(yōu)化的時(shí)候,加上主鍵和索引,查詢(xún)效率會(huì)提高。
通過(guò)SQL 查詢(xún)分析器,顯示比較:我的結(jié)論是:
分頁(yè)方案二:(利用ID大于多少和SELECT TOP分頁(yè))效率最高,需要拼接SQL語(yǔ)句
分頁(yè)方案一:(利用Not In和SELECT TOP分頁(yè)) 效率次之,需要拼接SQL語(yǔ)句
分頁(yè)方案三:(利用SQL的游標(biāo)存儲(chǔ)過(guò)程分頁(yè)) 效率最差,但是最為通用
在實(shí)際情況中,要具體分析。
相關(guān)文章
ASP存儲(chǔ)過(guò)程開(kāi)發(fā)應(yīng)用詳解
ASP開(kāi)發(fā)中存儲(chǔ)過(guò)程應(yīng)用詳解|調(diào)用,參數(shù),存儲(chǔ),數(shù)據(jù)庫(kù),輸出,編譯,mycomm,輸入,userid,代碼 ASP與存儲(chǔ)過(guò)程(Stored Procedures)的文章不少,但是我懷疑作者們是否真正實(shí)踐過(guò)。2008-10-10
結(jié)合asp和存儲(chǔ)過(guò)程做的搜索程序
結(jié)合asp和存儲(chǔ)過(guò)程做的搜索程序...2006-08-08
ASP 千萬(wàn)級(jí)數(shù)據(jù)分頁(yè)的存儲(chǔ)過(guò)程
經(jīng)測(cè)試,在 14483461 條記錄中查詢(xún)第 100000 頁(yè),每頁(yè) 10 條記錄按升序和降序第一次時(shí)間均為 0.47 秒,第二次時(shí)間均為 0.43 秒2008-11-11
以前寫(xiě)的一個(gè)分頁(yè)存儲(chǔ)過(guò)程,剛才不小心翻出來(lái)的
以前寫(xiě)的一個(gè)分頁(yè)存儲(chǔ)過(guò)程,剛才不小心翻出來(lái)的...2006-06-06
asp sqlserver 執(zhí)行存儲(chǔ)過(guò)程返回記錄集報(bào)對(duì)象關(guān)閉時(shí)不允許操作
asp sqlserver 執(zhí)行存儲(chǔ)過(guò)程返回記錄集報(bào)對(duì)象關(guān)閉時(shí)不允許操作的臨時(shí)解決方法。大家有更好的方法,可以說(shuō)下。2009-08-08

