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方式的,查詢開(kāi)銷少得多,上圖顯示 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 Server誤區(qū)30日談 第25天 有關(guān)填充因子的誤區(qū)
填充因子僅僅在索引創(chuàng)建或重建時(shí)生效,SQL Server存儲(chǔ)引擎并不會(huì)一直保證頁(yè)內(nèi)的空閑值和填充因子保持一致2013-01-01將string數(shù)組轉(zhuǎn)化為sql的in條件用sql查詢
將string數(shù)組轉(zhuǎn)化為sql的in條件就可以用sql查詢了,下面是具體是的示例,大家可以參考下2014-05-05一條SQL語(yǔ)句查詢多個(gè)數(shù)據(jù)庫(kù)
最近做項(xiàng)目遇到這樣的需求,要求一條SQL語(yǔ)句從多個(gè)數(shù)據(jù)庫(kù)查詢出相關(guān)聯(lián)的結(jié)果,輸出到客戶端,怎么解決呢?下面小編給大家介紹下,一起看看吧2018-03-03按日期選擇最晚日期與最早日期對(duì)應(yīng)的數(shù)的差值
想得到當(dāng)天的最早時(shí)間與最晚時(shí)間的number的差值,需要的朋友可以參考下。2009-11-11根據(jù)日期知道當(dāng)天是星期幾的手動(dòng)計(jì)算方法
在網(wǎng)上看到一篇文章,非常有意思,根據(jù)日期知道當(dāng)天是星期幾的方法,來(lái)看看吧。2010-03-03SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
數(shù)據(jù)庫(kù)的使用過(guò)程中由于程序方面的問(wèn)題有時(shí)候會(huì)碰到重復(fù)數(shù)據(jù),重復(fù)數(shù)據(jù)導(dǎo)致了數(shù)據(jù)庫(kù)部分設(shè)置不能正確設(shè)置2013-05-05SQL Server之SELECT INTO 和 INSERT INTO SELECT案例詳解
這篇文章主要介紹了SQL Server之SELECT INTO 和 INSERT INTO SELECT案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08當(dāng)master down掉后,pt-heartbeat不斷重試會(huì)導(dǎo)致內(nèi)存緩慢增長(zhǎng)的原因及解決辦法
這篇文章主要介紹了當(dāng)master down掉后,pt-heartbeat不斷重試會(huì)導(dǎo)致內(nèi)存緩慢增長(zhǎng)的原因及解決辦法,需要的朋友可以參考下2016-10-10