SQL SERVERページング

13884 ワード

SQL SERVER 2012は、ORDER BY句に新しい要素offsetを追加し、ユーザーがソートが完了した結果セットで出力行範囲をカスタマイズできるようにし、ページングSQLの書き方と効率を大幅に簡素化した.以下に、従来の2つのページング方式との簡単な比較を示す.
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です.