只是做了更大資料量、不同位置頁的比較。
# 建立表格:
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萬條、無索引、字符串內容的各種測試,記得告訴我一下結果。
以上是三種分頁方式效率的簡單測試的詳細內容。更多資訊請關注PHP中文網其他相關文章!