資料庫的分頁查詢一般由兩個查詢組成:
selectcount(*) 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()這個視窗函式既可以配合排名函式使用,也可以配合聚合函式使用。例如:
selectcount(*) 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 全連...