只是做了更大數據量、不同位置頁的對比。
建立表:
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萬條、無索引、字符串內容的各種測試,記得告訴我一下結果。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END