2010-11-11 1 views
1

Допустим, у меня есть следующие таблицы в SQL Server 2008:Когда использовать индекс покрытия, составной индекс, и уникальные столбчатых индексы

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

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

Скажем, мой самый распространенный запрос заключается в следующем:

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

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

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

Если я оставляю первичный ключ как есть и независимо индексирую идентификатор ClientID и RegionID, который дает мне 3 индекса, которые должны поддерживаться RDBMS, PLUS, сканирование таблицы по-прежнему необходимо для возврата имени ProfileName, t покрыт. Это кажется тяжелым.

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

ответ

1

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

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) 
+0

@Quassnoi мой друг, вы вернулись. Я предполагаю, что вы имеете в виду «... и оставить основной индекс тоже»? Не только этот индекс? – IamIC

+0

@IanC: да, конечно. – Quassnoi

+0

Quassnoi У меня есть два вопроса: 1) Я бы подумал (ClientID, RegionID ...) было бы лучше, так как ClientID является самым уникальным столбцом (хорошо, я не упоминал об этом в моем вопросе, предоставленном). Я считаю, что заказ является самым уникальным для наименее уникального. Второй вопрос: почему имя ProfileName в индексе, но не как включенный столбец, когда мы не запрашиваем его конкретно? – IamIC

 Смежные вопросы

  • Нет связанных вопросов^_^