SQL分頁實現:Offset-Fetch

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

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子句以後執行;

分頁實現的思路:fetch

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

一,使用order-offset-fetch分頁

建立示例數據code

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)blog

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,修改爲分頁的通用格式ip

--分頁的索引,頁碼從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)io

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子句不對結果集排序。

相關文章
相關標籤/搜索