2012-12-04 4 views
1

Я создал эти два индекса на основе того, как Мастер указателей предложил для разных сценариев. Мне интересно, являются ли они одинаковыми или они разные?В чем разница между этими двумя индексами в SQL Server?

Index (1):

CREATE NONClustered Index [IX_Rec_RecoveryDate_RecoveryDateTypeKey_CaseId] 
ON [Rec].[RecoveryDate] ([RecoveryDateTypeKey], [CurrentFlag]) 
INCLUDE (CaseId) 

Index (2):

CREATE NONClustered Index [IX_Rec_RecoveryDate_currentFlag] 
ON [Rec].[RecoveryDate] ([CurrentFlag]) 
INCLUDE (CaseId, RecoveryDateTypekey) 

ответ

4

Вопрос в том, какие вопросы вы пытаетесь оптимизировать?

Эти два индекса очень разные. Первый индекс был бы полезен для такого запроса:

SELECT CaseId 
FROM Rec.RecoveryDate 
WHERE RecoveryTypeKey = 5 
AND CurrentFlag = 1 -- or whatever 

Первый индексирует столбцы в предложении WHERE. SQL Server сможет искать указанные RecoveryDateTypeKey и CurrentFlag. Поскольку CaseId INCLUDEd в узлах листа индекса, SQL Server не нужно будет присоединяться к таблице, чтобы получить его.

Используя тот же запрос, второй указатель будет вести себя по-разному. Если вам повезет, SQL Server будет искать все записи, где CurrentFlag равно 1. Затем он пересечет эти листовые узлы, которые ищут соответствующий RecoveryTypeKey. С другой стороны, если есть много записей, где CurrentFlag равен 1, SQL Server может вместо этого выполнить сканирование индекса.

Опять же, если вы желаете, чтобы оптимизировать запрос следующим образом:

SELECT CaseId, RecoveryTypeKey 
FROM Rec.RecoveryDate 
WHERE CurrentFlag = 1 

Первый индекс был бы бесполезным, потому что CurrentFlag является второй столбец в индексе. SQL Server не смог бы найти его для CurrentFlag = 1, поэтому он, вероятно, выполнит сканирование индекса.

+0

Спасибо за этот ответ! – Jaxidian

2

они отличаются. Индекс 1 индексирует два столбца, индекс 2 индексирует один столбец, но включает в себя два столбца в узлах.

Разница в основном означает, что при поиске с использованием двух столбцов индекс 1 может быть намного быстрее, чем индекс 2.
Индекс 2 будет лучше, чем нормальный индекс одного столбца, потому что если вам нужен другой столбец в вашем результате индекс 2 уже имеет значение, поэтому поиск с фактической таблицей не потребуется.

0

Индексы сохраняют одну и ту же информацию (1 строка в строке таблицы восстановления с столбцами caseid, RecoveryDateTypeKey, CurrentFlag), но организованы в другом порядке и, следовательно, могут использоваться для разных запросов.

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

WHERE RecoveryDateTypeKey = @p1 --Prefix matching! 

и

WHERE RecoveryDateTypeKey = @p1 AND CurrentFlag = @p2 

Второй индекс обрабатывает только

WHERE CurrentFlag = @p2 

Если CurrentFlag является низкой колонкой мощности, такая как бит или char (1) (Y/N), тогда я бы рекомендовал фильтрованные индексы.

CREATE INDEX IX_REC_Yes_fltr on Recovery (RecoveryDateTypeKey) WHERE (CurrentFlag = 'Y') 
INCLUDE (CaseId) --Assumes that CurrentFlag = 'Y' is the most used value 

--Maybe even a second one. 
CREATE INDEX IX_REC_No_fltr on Recovery (RecoveryDateTypeKey) WHERE (CurrentFlag = 'N') 
INCLUDE (CaseId) --Maybe handle CurrentFlag = 'N' as well. 

Каждый фильтруется индекс включает только значения, которые удовлетворяют критериям, таким образом вместе они имеют тот же размер, как нефильтрованной индекс.

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