Когда использовать индекс покрытия, составной индекс и уникальные столбчатые индексы - PullRequest
1 голос
/ 11 ноября 2010

Допустим, у меня есть следующая таблица в SQL Server 2008:

ProfileID   int          //identity; index: unique, primary key, clustered
ClientID    int
RegionID    int
ProfileName nvarchar(50)

Столбцы 2 и 3 связаны с соответствующими таблицами посредством внешних связей.

Допустим, мой самый распространенный запрос:this:

SELECT ProfileID, ProfileName
FROM   Profiles
WHERE  ClientID = ? AND RegionID = ?
ORDER  BY ProfileName

Какая система индексирования лучше всего подходит?

Если я добавлю индекс покрытия (ProfileID, ProfileName), то это убьет кластерный индекс по умолчанию, поскольку индексы покрытия должны бытьнекластеризованный, но удовлетворяет, по крайней мере, возвращаемой части запроса.

Если я оставлю первичный ключ как есть, и независимо индексирую ClientID и RegionID, это дает мне 3 индекса, которые должны поддерживатьсяСУБД, ПЛЮС, сканирование таблицы все равно необходимо для возврата ProfileName, поскольку оно не охватывается.Это кажется тяжелым.

Простой пример того, насколько сложным может быть планирование индексации.

1 Ответ

1 голос
/ 11 ноября 2010

Для этого запроса:

SELECT  ProfileID, ProfileName
FROM    Profiles
WHERE   ClientID = ? AND RegionID = ?
ORDER BY
        ProfileName

Вы должны создать этот индекс:

CREATE INDEX ix_profiles_region_client_name ON (RegionID, ClientID, ProfileName)

В пределах одного значения (RegionID, ClientID) записи сортируются по ProfileName, поэтому записи будут отсортированы, и дополнительная сортировка не потребуется.

Поскольку ProfileID является PRIMARY KEY CLUSTERED, он неявно включается в каждую запись индекса, поэтому нет необходимости явно указывать его в определении индекса.

Если бы это был не кластерный ключ, вам нужно было бы добавить его в индекс, чтобы он покрыл этот запрос:

CREATE INDEX ix_profiles_region_client_name__id ON (RegionID, ClientID, ProfileName) INCLUDE (ProfileID)
...