2

テーブルに多数のレコードがあり、レコードのページごとに制限が必要ですが、そのためのソリューションは 1 つしかありません

WITH data AS
(
    SELECT
        ID
       ,YourColumn
       ,ROW_NUMBER() OVER (ORDER BY ID) AS RowNum
    FROM
        YourTable
)
SELECT 
    *
FROM
    data
WHERE
    RowNum BETWEEN 5 AND 10

しかし、そのためには 1 つの外部クエリが必要であり、これはテーブルに 2 回ヒットします。mysql のように、次のように実行できます。

select * from employee limit 2,4

では、シングル ヒットでレンジ間のレコードを取得する方法はありますか。bcoz これが問題である場合、MSSQL でそのクエリの結果を高速に取得することはできません

4

2 に答える 2

0

あなたが持っているものは、SQL Server 2008 で最高です

別の方法は次のとおりです。

--skip first 5 records and display next 5 records
SELECT TOP 5 * FROM data 
WHERE ID
NOT IN(SELECT TOP 5 ID FROM data ORDER BY ID) 
ORDER BY ID

あなたが持っている場合Microsoft SQL Server 2012

SELECT * FROM TableName 
ORDER BY id 
OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY;

オフセット -> スキップされた行数

次へ -> 必要な次の行数

于 2013-03-21T11:22:54.993 に答える
0

構文は SQL Server のバージョン間で変更される場合がありますが、元のパフォーマンスの問題が解消されるわけではありません。テーブルの最後からページが必要な場合、SQL Server 2012 構文を使用しても、テーブル全体 (または並べ替え順序によってはインデックス) をスキャンする必要があり、非常に非効率的です。

ページに関するテーブル内のデータの順序が頻繁に変更されないと仮定すると、独自の「ページ インデックス」テーブルを作成できます。「ページ番号」、「開始 ID」、「終了 ID」の列を持つテーブル。そうすれば、特定のページの ID 範囲を非常に高速に取得できます。

もちろん、そのインデックステーブルのメンテナンスの問題があります。ページがクラスター化インデックスに基づいており、そのインデックスが自動 ID である場合は、削除のみを行う必要があります。DELETE がない場合は、はるかに優れています。(ストアド プロシージャを使用して) ブロックまたはパーティションのみを削除する場合は、これらの時点でページ インデックスを再構築できます。単一の削除がある場合は、削除トリガーを作成する必要があります。

このようなヘルパー テーブルは、必要に応じて、可変ページ サイズでも役立ちます。任意のページ サイズ (100 など) を取り、テーブルを使用して、ページ クエリのクエリ範囲をさらに制限します。必要なのは、行 ID とテーブル内の行数の位置との間の静的マッピングだけです。

編集:もちろん、挿入も気にする必要があります。最善の方法は、最後のページにあるレコード数のカウンターを保持し、ページ制限を超えたときに新しいページ エントリを生成することです。

于 2013-03-21T11:59:41.860 に答える