27

以下のクエリのクラスター化インデックス スキャン コストを削減するにはどうすればよいですか

DECLARE @PARAMVAL varchar(3)

set @PARAMVAL = 'CTD'
select * from MASTER_RECORD_TYPE where RECORD_TYPE_CODE=@PARAMVAL

上記のクエリを実行すると、インデックス スキャン 99 % が表示されました

私のテーブルの特徴の下にここを見つけてください:

ここに画像の説明を入力

以下に、テーブルのインデックスを貼り付けました。

CREATE TABLE [dbo].[MASTER_RECORD_TYPE] ADD  CONSTRAINT [PK_MASTER_REPORD_TYPE] PRIMARY KEY CLUSTERED 
(
    [Record_Type_Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
GO

インデックス スキャンのコストを削減する方法を教えてください。

4

3 に答える 3

32

まず第一に、検索するRECORD_TYPE_CODE場合は、その列にインデックスがあることを確認する必要があります。

それに加えて、主に2つのこと:

  • 使用しないSELECT *でください - 完全なデータ ページを取得するには、常にクラスター化インデックスに戻る必要があります。使用するSELECT列を明示的に指定する a を使用します

  • 可能であれば、クエリを満たすために必要なすべての列を含むインデックスなど、非クラスター化インデックスをカバーする方法を見つけるようにしてください。

このような非クラスター化インデックスをカバーしている場合、クエリ オプティマイザーは (完全なテーブル データである実際のクラスター化インデックスではなく) そのカバー インデックスを使用して結果をフェッチする可能性が高くなります。

于 2012-08-06T10:26:46.907 に答える
1

カバーされたインデックスを試して使用する必要があります。しかし、あなたが抱える問題は、あなたが使用しているということですSELECT *。あなたは本当にレコード全体が必要ですか?

いずれにせよ、別のインデックスに追加RECORD_TYPE_CODEすると、少なくともそのフィールドをインデックスページから読み取ることができるため、クエリに役立ちます。

于 2012-08-06T10:27:47.083 に答える
0

RECORD_TYPE_CODEクエリで、一部ではなくclustered index、いずれにも含まれていない列を使用しnon-clustered indexました。そのため、SQL Optimizerは、クラスター化インデックスをスキャンして、where句の述語を比較することを決定します。

クラスタ化されたインデックスにスキャンがあるのはなぜですか?

于 2012-08-06T10:32:34.083 に答える