Составной индекс против ВКЛЮЧЕНО Покрывающего индекса в SQL Server - PullRequest
8 голосов
/ 07 октября 2010

Я понимаю, что составные индексы всегда используются слева направо (например, если индекс был для города, штата, WHERE City = "Blah" или WHERE City = "Blah", а штат = "AA" будет работать нормально, но WHERE State = "АА" не будет).

Применяется ли этот же принцип к индексам INCLUDE?

Заранее спасибо!

Клей

Ответы [ 2 ]

15 голосов
/ 07 октября 2010

Включить столбцы можно использовать только для предоставления столбцов в часть запроса SELECT. Их нельзя использовать как часть индекса для фильтрации.

РЕДАКТИРОВАТЬ : Чтобы прояснить мою точку зрения, рассмотрим этот пример:

Я создаю простую таблицу и заполняю ее:

create table MyTest (
    ID int,
    Name char(10)
)

insert into MyTest
    (ID, Name)
    select 1, 'Joe' union all
    select 2, 'Alex'

Теперь рассмотрим эти 3 индекса и соответствующие им планы выполнения для простого SELECT.

select ID, Name
    from MyTest
    where Name = 'Joe'

Случай 1 : индекс только идентификатора приводит к TANLE SCAN.

create index idx_MyTest on MyTest(ID)

alt text

Случай 2 : указатель идентификатора, включая имя. Несколько лучше, потому что индекс покрывает запрос, но я все еще получаю операцию SCAN.

create index idx_MyTest on MyTest(ID) include (Name)

alt text

Случай 3 : указатель на имя, включая идентификатор. Это лучшее. Индекс построен на столбце в моем предложении WHERE, поэтому я получаю операцию SEEK, и индекс покрывает запрос из-за включенного столбца.

create index idx_MyTest on MyTest(Name) include (ID)

alt text

1 голос
/ 07 октября 2010

Нет, включаемые поля не упорядочены.

Вот некоторые дополнительные соображения по проектированию:

http://msdn.microsoft.com/en-us/library/ms190806.aspx

...