21

SQL Server 2008 R2 の Column1 と Column2 にインデックスを作成したい 以下のクエリの違いは何ですか:

  1. 含まれていない

    CREATE NONCLUSTERED INDEX [IX_1] ON [dbo].[MyTable] 
    (
        [Column1] ASC,
        [Column2] ASC
    ) ON [PRIMARY]
    
  2. または以下を含めます。

    CREATE NONCLUSTERED INDEX [IX_2] ON [dbo].[MyTable] 
    (
        [Column1] ASC
    )
    INCLUDE ([Column2]) ON [PRIMARY]
    
4

1 に答える 1

25

最初のものColumn2はインデックスキーに追加されます。2番目の例では、キーに追加されない(*)場合があります。その場合、インデックスリーフページにのみ表示されます。これにより、インデックスを検索できますが、の値を取得するためColumn1にベーステーブルに戻る必要はありません(ブックマークルックアップ/キールックアップColumn2) 。

つまり、index2を次のようなクエリの「カバー」にします。

SELECT Column1,Column2
FROM [dbo].[MyTable] 
WHERE Column1 = 'X'

また、次のようなクエリもカバーしています

SELECT Column1,Column2
FROM [dbo].[MyTable] 
WHERE Column1 = 'X' AND Column2 = 'Y' 

ただし、index1は、2つの列を直接検索できるため、2番目のクエリのパフォーマンスが向上する可能性があります(検索のみが可能で、述語Column1に一致するかどうかを確認するためにインデックスリーフレベルで一致するすべての行を評価する必要があるのとは対照的です)。がそのインデックスに対する検索述語として使用されておらず、そのインデックスに対するクエリが順序付けされてもメリットがない場合Column2は、キーのサイズを抑えてページ数を減らすために、-d列として追加する必要があります。索引。Column2Column2INCLUDE

(*)上記で「できない」と言う理由はColumn2、クラスター化インデックスキー(の一部)である場合、オプションで作成されていない非クラスター化インデックスに対して、クラスター化インデックスキーが追加されるためです。UNIQUE

于 2012-05-31T06:39:55.783 に答える