SQLSERVER分頁(yè)查詢關(guān)于使用Top方式和row_number()解析函數(shù)的不同
臨近春節(jié),心早已飛了不在工作上了,下面小編給大家整理些數(shù)據(jù)庫(kù)的幾種分頁(yè)查詢。
Sql Sever 2005之前版本:
select top 頁(yè)大小 * from 表名 where id not in ( select top 頁(yè)大小*(查詢第幾頁(yè)-1) id from 表名 order by id ) order by id
例如:
select top 10 * --10 為頁(yè)大小 from [TCCLine].[dbo].[CLine_CommonImage] where id not in ( --40是這么計(jì)算出來(lái)的:10*(5-1) -- 頁(yè)大小*(查詢第幾頁(yè)-1) select top 40 id from [TCCLine].[dbo].[CLine_CommonImage] order by id ) order by id
結(jié)果為:

Sql Sever 2005及以上版本,多了個(gè)分頁(yè)查詢方法:
/* * firstIndex:起始索引 * pageSize:每頁(yè)顯示的數(shù)量 * orderColumn:排序的字段名 * SQL:可以是簡(jiǎn)單的單表查詢語(yǔ)句,也可以是復(fù)雜的多表聯(lián)合查詢語(yǔ)句 */ 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
結(jié)果:

這兩個(gè)方法,就僅僅是多了一列 rewnumber 嗎?當(dāng)然不是,來(lái)看下內(nèi)部差別吧:
在兩個(gè)SQL上,分別加入以下SQL,并使用MS的“包括執(zhí)行計(jì)劃”,便于查看執(zhí)行詳情:
SET STATISTICS TIME ON GO
要執(zhí)行的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 為頁(yè)大小 from [TCCLine].[dbo].[CLine_CommonImage] where id not in ( --40是這么計(jì)算出來(lái)的:10*(5-1) -- 頁(yè)大小*(查詢第幾頁(yè)-1) select top 40 id from [TCCLine].[dbo].[CLine_CommonImage] order by id ) order by id
執(zhí)行之后,查看執(zhí)行計(jì)劃:

看得出,兩個(gè)同樣功能的SQL,執(zhí)行時(shí),使用 row_number() 的,要比是用 純TOP方式的,查詢開銷少得多,上圖顯示 28:72,純top方式,使用了兩次聚集掃描。
再來(lái)看下執(zhí)行時(shí)間信息:
row_number()方式的:

純top方式:

相比之下,還是row_number()解析函數(shù)效率比較高寫。
以上所述是小編給大家分享的SQLSERVER分頁(yè)查詢關(guān)于使用Top方式和row_number()解析函數(shù)的不同,希望對(duì)大家有所幫助。
相關(guān)文章
SQL 尚未定義空閑 CPU 條件 - OnIdle 作業(yè)計(jì)劃將不起任何作用
今天在配置sql server 代理服務(wù)器的計(jì)劃任務(wù)的時(shí)候發(fā)現(xiàn)了日志中提示這個(gè)SQL 尚未定義空閑 CPU 條件 - OnIdle 作業(yè)計(jì)劃將不起任何作用信息導(dǎo)致無(wú)法執(zhí)行計(jì)劃任務(wù),那么可以按照下面的方法解決即可2021-06-06
Spark SQL 2.4.8 操作 Dataframe的兩種方式
這篇文章主要介紹了Spark SQL 2.4.8 操作 Dataframe的兩種方式,方式一是通過(guò)dsl操作,方式二是利用sql方式操作,每種方式通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10
使用row_number()實(shí)現(xiàn)分頁(yè)實(shí)例
或許大家不知道,其實(shí)使用row_number()是可以實(shí)現(xiàn)分頁(yè)的,下面有個(gè)不錯(cuò)的示例,大家可以嘗試操作下2013-11-11
SQL Server 使用join all優(yōu)化 or 查詢速度
一個(gè)老項(xiàng)目,加載列表奇慢,超過(guò)10秒鐘, 主要涉及兩個(gè)表, user表,procuts表。因?yàn)樯婕岸鄬哟?,使用site字段保存目錄2020-09-09
SQL Server使用Windows身份驗(yàn)證與JDBC連接數(shù)據(jù)庫(kù)的操作流程
在企業(yè)級(jí)應(yīng)用中,數(shù)據(jù)庫(kù)的安全性是非常重要的,SQL Server 提供了多種身份驗(yàn)證方式,其中 Windows 身份驗(yàn)證是一種較為安全且方便的管理方式,本文將介紹如何在 Java 中使用 JDBC 連接 SQL Server 數(shù)據(jù)庫(kù),并且通過(guò) Windows 身份驗(yàn)證來(lái)確保數(shù)據(jù)訪問(wèn)的安全性2024-12-12

