ホームページ >データベース >mysql チュートリアル >SQL Server で OFFSET をシミュレートするには?
SQL Server クエリでの OFFSET のシミュレーション
SQL Server には、他のデータベース システムとは異なり、直接の OFFSET
句がありません。 この記事では、行をスキップしてサブセットを取得する同じ機能を実現する方法について詳しく説明します。
SQL Server 2005 以降のソリューション:
バージョン 2005 以降の最も効率的な方法は、サブクエリ内で ROW_NUMBER()
を使用することです。
行番号の割り当て: サブクエリは、指定された列 (例: ID
) に従って順序付けされた一意の行番号を各レコードに割り当てます。
<code class="language-sql">SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum FROM MyTable</code>
行番号によるフィルター: 次に、外側のクエリはこの結果セットをフィルターして、必要な範囲内の行のみを選択します。 @startRow
と @endRow
は、それぞれ開始行番号と終了行番号を表します。
<code class="language-sql">SELECT col1, col2 FROM ( SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum FROM MyTable ) AS RowNumberedTable WHERE RowNum BETWEEN @startRow AND @endRow;</code>
SQL Server 2000 のアプローチ:
SQL Server 2000 には代替戦略が必要です:
インデックス スキップ スキャン: 希望の順序に一致する ORDER BY
句を持つ適切なインデックスが存在する場合、データベース エンジンはインデックス スキャンを使用して行を効率的にスキップできる可能性があります。 これはインデックスとデータの分布に大きく依存します。
ウィンドウ関数 (近似): ROW_NUMBER()
ほど直接的ではありませんが、他のウィンドウ関数を使用して同様の効果を達成できる可能性があります。ただし、これは 2005 の方法よりも効率が劣る可能性があります。
カーソルベースの反復: スクロール ロックを備えたカーソルを使用すると、結果セットを反復処理し、選択的に行をフェッチできますが、このアプローチは一般にセットベースのソリューションよりもパフォーマンスが低くなります。 絶対に必要な場合を除き、これは避けてください。
パフォーマンスに関する考慮事項:
パフォーマンスを最適化するには:
SELECT
句で必要な列のみを選択します。ROW_NUMBER()
の計算またはインデックス スキャンを高速化するために、順序付け列に適切なインデックスが配置されていることを確認します。これらの手法を採用すると、バージョンに関係なく、SQL Server の OFFSET
機能を効果的にシミュレートできます。 最適なパフォーマンスを得るには、ROW_NUMBER()
メソッド (SQL Server 2005 以降の場合) を強くお勧めします。
以上がSQL Server で OFFSET をシミュレートするには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。