2

私はインデックスにかなり慣れていません。次の表 [FORUM1] があります。

    [msg_id] [int] IDENTITY(1,1) NOT NULL,
    [cat_id] [int] NULL,
    [msg_title] [nvarchar](255) NULL

そして、非クラスター化インデックスを作成しました

CREATE NONCLUSTERED INDEX catindex ON forum1(cat_id)

この単純なクエリを実行すると、インデックスが使用されていないことがわかります

SELECT msg_title FROM forum1 where cat_id=4

CI を作成し、MSG_TITLE フィールドを含める場合にのみ、インデックスが呼び出されます。しかし、問題は、date=something、userid=20、status=1 のような実際のテーブルに対して、さらに多くの同様のクエリを実行する必要があることです。したがって、すべてのインデックスに列を含めることは私にとっては良くありません。

実行計画のスクリーンショット

4

1 に答える 1

6

msg_titleインデックスに含まれていません -> 非クラスター化インデックスで見つかった値は、実際のデータ ページへのキー ルックアップが必要になります。これはコストのかかる操作です。したがって、ほとんどの場合、テーブル スキャンの方が高速です。さらに、「テーブル スキャン」はヒープ (クラスター化されたインデックスのないテーブル) があることを示します。これは (ほとんどの場合) そもそも悪いことです。クラスタ化インデックスを使用しないのはなぜですか?

たとえば、インデックスにを含めることで、これを修正できます。msg_title

CREATE NONCLUSTERED INDEX catindex 
ON forum1(cat_id) INCLUDE(msg_title)

そして今、私はかなり確信しています.SQL Serverはそのインデックスを使用します(クエリに必要なすべてのデータをインデックス構造で見つけることができるため、インデックスはカバリングインデックスと呼ばれます)。ここでの利点は次のとおりです。余分な列はインデックスのリーフ レベルにのみ含まれるため、インデックスのサイズは最小限に抑えられます。それでも、インデックスがより頻繁に使用される可能性があります。それだけの価値があります!

于 2012-06-26T20:44:45.367 に答える