程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> 更多數據庫知識 >> SQLSERVER分頁查詢關於使用Top方式和row_number()解析函數的不同,rownumber分頁

SQLSERVER分頁查詢關於使用Top方式和row_number()解析函數的不同,rownumber分頁

編輯:更多數據庫知識

SQLSERVER分頁查詢關於使用Top方式和row_number()解析函數的不同,rownumber分頁


臨近春節,心早已飛了不在工作上了,下面小編給大家整理些數據庫的幾種分頁查詢。

Sql Sever 2005之前版本:

select top 頁大小 *
from 表名
where id not in
(
select top 頁大小*(查詢第幾頁-1) id from 表名 order by id
)
order by id 

例如:

select top 10 * --10 為頁大小
from [TCCLine].[dbo].[CLine_CommonImage]
where id not in
(
--40是這麼計算出來的:10*(5-1)
-- 頁大小*(查詢第幾頁-1)
select top 40 id from [TCCLine].[dbo].[CLine_CommonImage] order by id
)
order by id

結果為:

Sql Sever 2005及以上版本,多了個分頁查詢方法:

/*
* firstIndex:起始索引
* pageSize:每頁顯示的數量
* orderColumn:排序的字段名
* SQL:可以是簡單的單表查詢語句,也可以是復雜的多表聯合查詢語句
*/
select top pageSize o.* from (select row_number() over(order by orderColumn) as rownumber,* from(SQL) as o where rownumber>firstIndex; 

例如:

select top 10 numComImg.* from 
( select row_number() over(order by id asc) as rownumber,* from (select * FROM [TCCLine].[dbo].[CLine_CommonImage]) as comImg)
as numComImg where rownumber>40 

結果:

這兩個方法,就僅僅是多了一列 rewnumber 嗎?當然不是,來看下內部差別吧:

在兩個SQL上,分別加入以下SQL,並使用MS的“包括執行計劃”,便於查看執行詳情:

SET STATISTICS TIME ON
GO 

要執行的SQL:

SET STATISTICS TIME ON
GO
select top 10 numComImg.* from 
( select row_number() over(order by id asc) as rownumber,* from (select * FROM [TCCLine].[dbo].[CLine_CommonImage]) as comImg)
as numComImg where rownumber>40
SET STATISTICS TIME ON
GO
select top 10 * --10 為頁大小
from [TCCLine].[dbo].[CLine_CommonImage]
where id not in
(
--40是這麼計算出來的:10*(5-1)
-- 頁大小*(查詢第幾頁-1)
select top 40 id from [TCCLine].[dbo].[CLine_CommonImage] order by id
)
order by id 

執行之後,查看執行計劃:

看得出,兩個同樣功能的SQL,執行時,使用 row_number() 的,要比是用 純TOP方式的,查詢開銷少得多,上圖顯示 28:72,純top方式,使用了兩次聚集掃描。

再來看下執行時間信息:

row_number()方式的:


純top方式:


相比之下,還是row_number()解析函數效率比較高寫。

以上所述是小編給大家分享的SQLSERVER分頁查詢關於使用Top方式和row_number()解析函數的不同,希望對大家有所幫助。

您可能感興趣的文章:

  • SQL Server 排序函數 ROW_NUMBER和RANK 用法總結
  • SQL為查詢的結果加上序號(ROW_NUMBER) 合並多個查詢結果
  • SQLSERVER 2005的ROW_NUMBER、RANK、DENSE_RANK的用法
  • php下巧用select語句實現mysql分頁查詢
  • sqlserver巧用row_number和partition by分組取top數據
  • 三種SQL分頁查詢的存儲過程代碼
  • mysql分頁原理和高效率的mysql分頁查詢語句
  • 二種sql分頁查詢語句分享
  • sql分頁查詢幾種寫法

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved