mssql分頁原理及效率分析

jopen 11年前發布 | 14K 次閱讀 SQL Server 數據庫服務器 MSSQL

下面是常用的分頁,及其分頁效率分析。

1.分頁方案一:(利用Not In和SELECT TOP分頁)
語句形式:

  1. SELECT TOP 10 * 
  2. FROM TestTable 
  3. WHERE (ID NOT IN 
  4. (SELECT TOP 20 id 
  5. FROM TestTable 
  6. ORDER BY id)) 
  7. ORDER BY ID 
  1. SELECT TOP 頁大小 * 
  2. FROM TestTable 
  3. WHERE (ID NOT IN 
  4. (SELECT TOP 頁大小*頁數 id 
  5. FROM 表 
  6. ORDER BY id)) 
  7. ORDER BY ID 

2.分頁方案二:(利用ID大于多少和SELECT TOP分頁)

語句形式:

  1. SELECT TOP 10 * 
  2. FROM TestTable 
  3. WHERE (ID > 
  4. (SELECT MAX(id) 
  5. FROM (SELECT TOP 20 id 
  6. FROM TestTable 
  7. ORDER BY id) AS T)) 
  8. ORDER BY ID 
  1. SELECT TOP 頁大小 * 
  2. FROM TestTable 
  3. WHERE (ID > (SELECT MAX(id) 
  4. FROM (SELECT TOP 頁大小*頁數 id 
  5. FROM 表 
  6. ORDER BY id) AS T)) 
  7. ORDER BY ID  


3.分頁方案三:(利用SQL的游標存儲過程分頁)

  1. createprocedure SqlPager 
  2. @sqlstr nvarchar(4000), --查詢字符串 
  3. @currentpage int--第N頁 
  4. @pagesize int --每頁行數 
  5. as 
  6. set nocount on 
  7. declare @P1 int--P1是游標的id 
  8. @rowcount int 
  9. exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output 
  10. select ceiling(1.0*@rowcount/@pagesize) as 總頁數--,@rowcount as 總行數,@currentpage as 當前頁 
  11. set @currentpage=(@currentpage-1)*@pagesize+1 
  12. exec sp_cursorfetch @P1,16,@currentpage,@pagesize 
  13. exec sp_cursorclose @P1 
  14. set nocount off 

其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。
建議優化的時候,加上主鍵和索引,查詢效率會提高。

通過SQL 查詢分析器,顯示比較:我的結論是:

分頁方案二:(利用ID大于多少和SELECT TOP分頁)效率最高,需要拼接SQL語句

分頁方案一:(利用Not In和SELECT TOP分頁) 效率次之,需要拼接SQL語句

分頁方案三:(利用SQL的游標存儲過程分頁)效率最差,但是最為通用

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!