Подтвердить что ты не робот

Разница в создании индекса с помощью include column или без использования

Я хочу создать индекс в SQL Server 2008 R2 в столбце 1 и столбце2 В чем разница ниже запроса:

  • Не включать

    CREATE NONCLUSTERED INDEX [IX_1] ON [dbo].[MyTable] 
    (
        [Column1] ASC,
        [Column2] ASC
    ) ON [PRIMARY]
    
  • Или включите:

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

Ответ 1

В первом добавляется ключ Column2 к ключу индекса. Во втором случае он не может добавить (*) к ключу, и в этом случае он появится только на страницах листа индекса. Это может позволить поиску индекса с помощью 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 может хорошо работать лучше для второго запроса, так как он может искать по двум столбцам напрямую (в отличие от того, что он может искать только Column1, тогда необходимо оценить все соответствующие строки на уровне листа индекса, чтобы увидеть, они соответствуют предикату Column2). Если Column2 никогда не используется в качестве предиката поиска по этому индексу, и ваши запросы к этому индексу не будут полезны при заказе Column2, то он должен быть добавлен как столбец INCLUDE -d, чтобы сохранить размер ключа вниз и уменьшить количество страниц в индексе.

(*) Причина, по которой я говорю "не могу", состоит в том, что если Column2 является (частью) кластеризованным индексным ключом, то все равно будет добавлено в любом случае для не кластеризованного индекса, не созданного с помощью опции UNIQUE.