SqlSever分頁查詢,僅掃瞄一次表

2022-05-08 06:51:09 字數 1263 閱讀 4479

資料庫的分頁查詢一般由兩個查詢組成:

select

count(*) from goods

select

*from

(

select row_number() over(order

by goodsid) as rowid, *

from

goods

) as

awhere rowid >=

@pagesize

* (@pageindex

-1) +

1and rowid <=

@pagesize

*@pageindex

第乙個查詢,獲取符合條件的記錄總數,用於計算總頁數。第二個查詢獲取指定頁上的記錄。

兩個查詢需要執行兩次,也就是做兩次表掃瞄,這對效率是極大的損失。能不能只做一次表掃瞄?

row_number()函式在做排名時,肯定需要做一次表掃瞄,而排名完成後,肯定是知道有多少條記錄的,如果這個內部值能輸出到外部給呼叫者使用,那麼兩個查詢就可以合併為乙個查詢,且僅需要一次表掃瞄了。

經過研究,row_number()函式並沒有這個功能,但是同時發現 over()這個視窗函式既可以配合排名函式使用,也可以配合聚合函式使用。例如:

select

count(*) over() as recordcount from goods

那麼,如果利用視窗函式over(),然後同時搭配row_number()排名函式和count()聚合函式,sql server的執行計畫能否在內部自動優化為僅做一次表掃瞄?於是查詢改為如下:

select

*from

(

select

count(*) over() as

recordtotalcount,

row_number()

over(order

by goodsid) as

rowid,

*from

goods

) as

awhere rowid >=

@pagesize

* (@pageindex

-1) +

1and rowid <=

@pagesize

*@pageindex

經過測試,由於在同乙個查詢中,都使用了over()視窗函式,sql server在生成執行計畫時,自動優化為僅進行一次表掃瞄了

sqlsever2008 簡單分頁查詢例子

工資從高到低排序 輸出工資是第4到6行資料 select top 3 from emp where empno not in select top 3 empno from emp order by sal desc order by sal desc 工資從高到低排序 輸出工資是第13到15行資料...

SQL Sever分組查詢

在乙個學生成績表中,有來自不同班級裡的學生,現在我們要把他們進行分組,然後計算出每個班級的平均分,如此看來,就是我們今天要學到的重點,分組查詢 例如 下圖中需要將s1的學生和s2的學生分成兩組 select count as 人數 school as 學校 由上圖可見,s1的學生有1個,s2的學生有...

SQL SEVER 遞迴查詢

with ts as select fitemclassid,fitemid,fnumber,fparentid,fname,ffullnumber from t item where fparentid 0and fitemclassid 4 首先要查詢出最原始父級的資訊 union all 全連...