Допустим, у меня есть следующая таблица в 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 индекса, которые должны поддерживаться СУБД, ПЛЮС все равно потребуется сканирование таблицы для возврата ProfileName, поскольку оно не покрыто. Это кажется тяжелым.
Простой пример того, насколько сложным может быть планирование индексации.
(ClientID, RegionID)
. Однако вы можете изменить порядок, если вам нужно выполнить поиск только поClientID
(или в сочетании со столбцами, отличными отRegionID
).ProfileName
находится в индексе, потому что используется в предложенииORDER BY
. Включенные столбцы не сортируются по индексу, поэтому запрос должен быть отсортирован, если вы включилиProfileName
в качестве неключевого столбца. 11.11.2010(ClientID, RegionID)
иRegionID
11.11.2010RegionID
во второй. Запросы на(ClientID, RegionID)
будут обслуживаться первым. 11.11.2010