Ответ 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
.