7

編集: 私はまだもっと答えを待っています。ありがとう!

SQL 2000 では、新しい ID 列と主キーを使用して一時テーブルを作成し、A と B の間の ID 列を選択する一時テーブル メソッドを使用していました。

SQL 2005が登場したとき、私はそれを知りRow_Number()、それ以来ずっと使用しています...

しかし今、深刻なパフォーマンス上の問題を発見しましたRow_Number()。それほど巨大ではない結果セットを操作し、ID 列を並べ替える場合は、非常にうまく機能します。ただし、10,000 を超えるレコードなどの大規模な結果セットを操作し、非 ID 列で並べ替える場合、パフォーマンスは非常に低下します。結果セットが 250,000 レコードを超える場合、ID 列で並べ替えてもパフォーマンスが低下します。私にとっては、「コマンドタイムアウト!」というエラーがスローされるようになりました。Row_Number()

SQL 2005 で大きな結果セットをページ分割するために何を使用しますか? この場合、一時テーブルの方法はまだ優れていますか? SET ROWCOUNT で一時テーブルを使用するこの方法がより適切に実行されるかどうかはわかりません...しかし、複数列の主キーがある場合、間違った行番号を与えるという問題があると言う人もいます。

私の場合、結果セットを日付型の列で並べ替えることができる必要があります...本番用のWebアプリ用です。

SQL 2005 で高パフォーマンスのページネーションのために何を使用しているか教えてください。また、インデックスを作成するスマートな方法も知りたいです。ここでは、適切な主キーおよび/またはインデックス (クラスター化/非クラスター化) を選択することが大きな役割を果たすと思われます。

前もって感謝します。

PSスタックオーバーフローが何を使用するか知っている人はいますか?

編集:私のものは次のように見えます...

SELECT postID, postTitle, postDate
FROM
   (SELECT postID, postTitle, postDate, 
         ROW_NUMBER() OVER(ORDER BY postDate DESC, postID DESC) as RowNum
    FROM MyTable
   ) as DerivedMyTable
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1

postID: Int、Identity (自動インクリメント)、主キー

postDate: 日時

編集:誰もが Row_Number() を使用していますか?

4

2 に答える 2

8

row_number() 手法は迅速なはずです。100,000 行で良い結果が得られました。

次のような row_number() を使用していますか?

SELECT column_list
FROM
   (SELECT column_list
         ROW_NUMBER() OVER(ORDER BY OrderByColumnName) as RowNum
    FROM MyTable m
   ) as DerivedTableName
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1

...そして、column_list のカバリング インデックスおよび/または「OrderByColumnName」列のインデックスはありますか?

于 2008-10-04T03:09:31.347 に答える
1

PostDate フィールドにインデックスがあれば、サンプル クエリの ROW_COUNT は数千行でかなり高速になるはずです。そうしないと、サーバーは PK で完全なクラスター化インデックス スキャンを実行し、事実上すべてのページをロードし、PostDate フィールドを取得して並べ替え、結果セット用に抽出する行を決定し、それらの行を再度取得する必要があります。これは、一時インデックスを何度も作成するようなものです (プレーンにテーブル/インデックス スプールが表示される場合があります)。

タイムアウトが発生するのも不思議ではありません。

私の提案: PostDate DESC にインデックスを設定します。これが ROW_NUMBER が超えるものです - (ORDER BY PostDate DESC, ...)

あなたが参照している記事に関しては、私は過去に ROW_COUNT を使用せずに SQL Server 2000 でほとんどページングなどを行ってきましたが、記事で使用されているアプローチは最も効率的なものです。すべての状況で機能するとは限りません (一意またはほぼ一意の値が必要です)。他のいくつかの方法の概要については、こちらを参照してください。

.

于 2008-10-20T20:42:56.177 に答える