SQL SERVERページング
13884 ワード
SQL SERVER 2012は、ORDER BY句に新しい要素offsetを追加し、ユーザーがソートが完了した結果セットで出力行範囲をカスタマイズできるようにし、ページングSQLの書き方と効率を大幅に簡素化した.以下に、従来の2つのページング方式との簡単な比較を示す.
SQL code
クエリー計画から見ると、2012年のクエリー計画ではoffsetがtop反復器を直接操作し、ページング計画は非常に簡単で、後の2つよりも簡単に明らかになったように見えます.
一方,システムが見積もったクエリオーバーヘッドでは,OFFSETが9%,ROW_NUMBERが45%、TOPが47%(合わせて101%--|)、OFFSETが絶対的な優勢を占めています.
2008の更新で一番好きなのはMERGE、2012でOFFSETです.
SQL code
use
master
go
set
nocount
on
go
set
showplan_text
on
go
--
2012 OFFSET
select
number
from
spt_values
where
type
=
'
p
'
order
by
number
offset
10
rows
fetch
next
5
rows
only
;
go
--
2005 ROW_NUMBER
select
number
from
(
select
number
,row_number()
over
(
order
by
number
)
as
num
from
spt_values
where
type
=
'
p
'
) t
where
num
between
11
and
15
order
by
number
asc
go
--
2000 TOP
select
number
from
(
select
top
5
number
from
(
select
top
15
number
from
spt_values
where
type
=
'
p
'
order
by
number
asc
) t
order
by
number
desc
) t
order
by
number
asc
go
set
showplan_text
off
go
/*
StmtText ---------------------------------------------------------------------------------------------------------- select number from spt_values where type='p' order by number offset 10 rows fetch next 5 rows only; StmtText -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |--Top(OFFSET EXPRESSION:((10)),TOP EXPRESSION:((5))) |--Index Scan(OBJECT:([mssqlsystemresource].[sys].[spt_values].[ix2_spt_values_nu_nc]), WHERE:(CONVERT(nchar(3),[mssqlsystemresource].[sys].[spt_values].[type],0)=N'p') ORDERED FORWARD) StmtText --------------------------------------------------------------------------------------------------------------------------------------------------------------------- select number from ( select number,row_number() over(order by number) as num from spt_values where type='p' ) t where num between 11 and 15 order by number asc StmtText ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |--Sort(ORDER BY:([mssqlsystemresource].[sys].[spt_values].[number] ASC)) |--Filter(WHERE:([Expr1005]>=(11) AND [Expr1005]<=(15))) |--Top(TOP EXPRESSION:(CASE WHEN (15) IS NULL OR (15)<(0) THEN (0) ELSE (15) END)) |--Sequence Project(DEFINE:([Expr1005]=row_number)) |--Segment |--Index Scan(OBJECT:([mssqlsystemresource].[sys].[spt_values].[ix2_spt_values_nu_nc]), WHERE:(CONVERT(nchar(3),[mssqlsystemresource].[sys].[spt_values].[type],0)=N'p') ORDERED FORWARD) StmtText ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- select number from ( select top 5 number from ( select top 15 number from spt_values where type='p' order by number asc ) t order by number desc ) t order by number asc StmtText ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |--Sort(ORDER BY:([mssqlsystemresource].[sys].[spt_values].[number] ASC)) |--Sort(TOP 5, ORDER BY:([mssqlsystemresource].[sys].[spt_values].[number] DESC)) |--Top(TOP EXPRESSION:((15))) |--Index Scan(OBJECT:([mssqlsystemresource].[sys].[spt_values].[ix2_spt_values_nu_nc]), WHERE:(CONVERT(nchar(3),[mssqlsystemresource].[sys].[spt_values].[type],0)=N'p') ORDERED FORWARD)
*/
クエリー計画から見ると、2012年のクエリー計画ではoffsetがtop反復器を直接操作し、ページング計画は非常に簡単で、後の2つよりも簡単に明らかになったように見えます.
一方,システムが見積もったクエリオーバーヘッドでは,OFFSETが9%,ROW_NUMBERが45%、TOPが47%(合わせて101%--|)、OFFSETが絶対的な優勢を占めています.
2008の更新で一番好きなのはMERGE、2012でOFFSETです.