分頁實現:Offset-Fetch


分頁實現的方法又多了一種,在SQL Server 2012版本中,TSQL在Order By子句中新增 Offset-Fetch子句,用於從有序的結果集中,跳過一定數量的數據行,獲取指定數量的數據行,從而達到數據行分頁的目的。經過測試,從邏輯讀取數量和響應的時間消耗來測評,使用Offset-Fetch實現的分頁方式,比Row_Number()方式性能要高很多。

Offset-Fetch子句要求結果集是有序的,因此,只能用於order by 子句中,語法如下:

ORDER BY order_by_expression [ ASC | DESC ]  [ ,...n ] [ <offset_fetch> ]
<offset_fetch> ::= { OFFSET { integer_constant | offset_row_count_expression } ROWS [ FETCH NEXT {integer_constant | fetch_row_count_expression } ROWS ONLY ] }

關鍵字解析:

  • Offset子句:用於指定跳過(Skip)的數據行;
  • Fetch子句:該子句在Offset子句之后執行,表示在跳過(Sikp)指定數量的數據行之后,返回一定數據量的數據行;
  • 執行順序:Offset子句必須在Order By 子句之后執行,Fetch子句必須在Offset子句之后執行;

分頁實現的思路:

  1. 在分頁實現中,使用Order By子句,按照指定的columns對結果集進行排序;
  2. 使用Offset子句跳過前N頁:Offset (@PageIndex-1)*@RowsPerPage rows;
  3. 使用Fetch子句呈現當前Page:Fetch next @RowsPerPage rows only;

一,使用order-offset-fetch分頁

創建示例數據

use tempdb
go
create table dbo.dt_test
(
    id int,
    code int
)
go
insert into dbo.dt_test(id,code)
values(1,1),(2,2),(3,1),(4,2),(5,1),(6,2)
View Code

1,使用Offset子句跳過指定數目的數據行

select * 
from dbo.dt_test
order by id
offset 2 rows

2,使用Offset-Fetch子句跳過指定數目的數據行之后,返回指定數目的數據行

select * 
from dbo.dt_test
order by id
offset 2 rows
fetch next 2 rows only

3,修改成分頁的通用格式

--分頁的索引,頁碼從1開始
declare @PageIndex int
--每頁顯示的行數
declare @Size int

set @PageIndex=1
set @Size=100

select * 
from dbo.dt_test
order by id
offset (@PageIndex - 1) * @Size rows
fetch next @Size rows only

二,排序(order by)

order by子句的語法是:ORDER BY order_by_expression ,用於按照指定字段進行排序,通常有3種寫法:

  • select子句中列的name,或alias,排序子句(order by)的執行順序在select子句之后,可以使用列的Alias進行排序;
  • 表達式,按照表達式的計算結果進行排序;
  • select子句中列的序號,從1開始,此處的數值是序號,不建議使用;

上述三種寫法都會對查詢結果集進行排序,返回的結果集是有序的,但是,如果這樣寫,在order by子句中使用一個常量:

order by (select 1) 

該子句中的 1 不是列的序號,而是常量,SQL Server按照結果集的原始順序返回,order by子句不對結果集排序。

 

參考文章:

ORDER BY Clause (Transact-SQL)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM