2

何百万ものレコードがあるテーブルで、SQL Server で 80,000 を超えるレコードを選択しようとしています。問題は、正しいインデックスを持っていることですが、レコードセットを返すのに 15 分以上かかります。

私は MS SQL Server 2000 を使用しています。ストアド プロシージャを使用したページ付け方法を見つけましたが、結果セット全体を挿入し、ページごとに表示するレコードの量を選択する必要があるテンポラル テーブルを使用しています。この方法は時間がかかりすぎます。

私が実装できるより速い方法のための助けはありますか?

4

4 に答える 4

5

これを編集して、ユーザーのフィルタリングおよび並べ替えオプションの入力パラメーターを実装する必要がありますが、一般的な原則が適用されます。2000/2001のタイムフレームでSQL 2000を使用し、90Mのレコードテーブルを使用してこの手法を使用し、150の高速ページングを実現しました。 200k行の結果セット。キーのみが一時テーブルにあるため、非常に狭く、非常に小さい一時テーブルであり、パフォーマンスは高速です(このステップでは、テーブル自体ではなく、メインテーブルのインデックスを読み取るだけで済みます)。 、実際の(小さい)戻り結果セット(@PageSize行のみ)のメインテーブルから実際にデータを生成する場合、クエリはごく少数のレコードを読み取るだけで済みます。

Create Procedure GetPagedData
@Page Integer = 1,
@PageSize Integer = 100,
@UsersFilteringCOnditions,
@UsersSortOptions
As
Set NoCount On

Declare @Start Integer,
Declare @End Integer
Declare @NumRecs Integer

   -- Declare a temp table variable to hold all the pk values...
   Declare @Keys Table (rowNum integer Identity Primary Key NotNull,
                        keyVal Integer Not Null)

   -- Insert all the Primary Keys into the temp table variable...
   Insert @keys(keyVal)
   Select PrimaryKey From MyMillionRowTable
   Where UsersFilterConditionsAreTrue
   Order By UsersSortOptions

  -- Then, select from your big table only the data 
  -- from the rows for the page the user wants

   Select @NumRecs = Count(*) From Keys 
   Set @End = @Page * @PageSize
   Set @Start = @End + 1 - @PageSize

   Select {Insert ColumnListHere}
   From MyMillionRowTable T
       Join @Keys K On K.KeyVal = T.PrimaryKey 
   Where K.rowNum Between @Start And @End
于 2008-12-19T15:40:28.770 に答える
0

いくつかのオプションがあります。通常の DB チューニングのトリック (私は専門家ではありません)。関心のあるサブセット データを、舞台裏で小さなテーブルに抽出することは可能ですか?

于 2008-12-19T14:52:02.253 に答える
0

それは間違いなくインデックスを使用していますか?クラスタ化インデックスですか? 実行計画を確認します。インデックスを再構築することもできます。

それができない場合は、クエリとテーブル定義とインデックスを投稿してください。

また、SQL 構成 (使用されている RAM の量など) またはハードウェアの制限である可能性もあります。単一ディスクですか、それとも RAID ですか。RAID のドライブの 1 つに障害が発生し、バックグラウンドで再構築された場合は?

于 2008-12-19T14:56:34.880 に答える
0

@jmpena: 申し訳ありませんが、実行計画はブックマークから 2% 読み取り、98% インデックスをスキャンします

ここであなた自身の質問に答えたと思います。「インデックスをスキャンする 98%」。インデックスをスキャンするということは、SQL が、統計に基づいて選択されたパフォーマンスに役立つ可能性があるインデックスを見つけたことを意味します。インデックスによっては、操作がテーブル スキャン自体と同じくらい悪い場合があります。

インデックス/クエリが適切に調整されていれば、インデックス シークが表示されるはずです。

テーブルにあるインデックスを共有できますか? (sp_help {テーブル名})

于 2008-12-19T16:30:00.433 に答える