分頁 本文的三種分頁方案來自於:
只是做了更大資料量、不同位置頁的對比。
建立表:
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
插入資料:(100萬條)
SET IDENTITY_INSERT TestTable ON
declare @i int
set @i=1
while @i<=1000000
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 頁大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 頁大小*頁數 id
FROM 表
ORDER BY id))
ORDER BY ID
-------------------------------------
分頁方案二:(利用ID大於多少和SELECT TOP分頁)
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
測試結果:
測試均為每頁10條,三個數字依次為三種方案出結果需要的時間,單位為秒:
第2頁:18,10,29
第500頁:12,8,21
第50000頁:16,18,22
第500000頁:24,16,22
這次測試的主要目的是對大資料量不同部分的翻頁效率的測試。本以為應該是一個線性結果,結果發現變化很奇怪。多測試幾次結果誤差在1、2秒之內,估計sql server對於翻頁也是根據不同位置有最佳化的。看了查詢分析,主要的花銷還是order by,這還是主鍵的,如果不是主鍵,或者是字串,估計更慢。
因為還有別的事情要忙,也沒有做進一步的測試,有興趣的朋友可以繼續做做10萬條、無索引、字串內容的各種測試,記得告訴我一下結果。