2016-02-25 3 views
1

У меня есть следующие кластерные индексы для таблицы serviceregistration.Как оптимизатор запросов SQL Server выбирает некластеризованные индексы из доступных индексов для конкретной таблицы?

Index Name ---------------+ Column Name ----------------- + Index Type 
IX_SERVICEREGISTRATION_I | SERREGNO      | NONCLUSTERED 
IX_SERVICEREGISTRATION_II | SERREGNO, SERCUSTID   | NONCLUSTERED 
IX_SERVICEREGISTRATION_III| PLACEID, JOBID, SERREGNO  | NONCLUSTERED 

Запрос 1:

Select CustomerName, Place 
From dbo.ServiceRegistration 
Where SERREGNO = 'JAN1234' And PLACEID = 1 

Запрос 2:

Select CustomerName, Place 
From dbo.ServiceRegistration 
Where SERREGNO = 'JAN1234' And SERCUSTID = 'A123' 

Запрос 3:

Select CustomerName, Place 
From dbo.ServiceRegistration 
Where JOBID = 5 And PLACEID = 1 And SERREGNO = 'JAN1234' 

Являются ли указанные выше созданные индексы полезными для этих запросов или нет?

+0

Можете ли вы изучить Оценочный план выполнения (Ctrl + L в SSMS)? Имеют ли эти индексы какие-либо ВКЛЮЧЕННЫЕ столбцы? –

+0

@StevenHibble. Для этих индексов нет INCLUDE-столбцов. – RGS

ответ

1
  • Запрос # 1 можно использовать IX_SERVICEREGISTRATION_I
  • Запрос # 2 может использовать IX_SERVICEREGISTRATION_II
  • Запрос # 3 может использовать индекс # 3

Любой индекс соединения (составлен из более чем одного столбца) может использоваться только когда-либо, когда вы используете в своих запросах n самых больших столбцов - поэтому ни запрос № 1, ни запрос №2 не могут использовать индекс №3.

Но фактическое использование индексов будет зависеть от множества других вещей - например, сколько строк из всей таблицы вы выбираете с помощью этого запроса?

Ни один из запросов не «покрыт» и не индексирует - например. ни один запрос не может вернуть значения, которые вы запрашиваете, просто просматривая индекс, что обычно ограничивает полезность индекса. Если вы добавите INCLUDE (CustomerName, Place) к любому из индексов - , то вероятность их использования будет значительно улучшена.

+0

Пожалуйста, используйте ** международно понятые ** номера - тысячи, миллионы, миллиарды. Вам нужно включить столбец в * те индексы *, которые будут использоваться для этого запроса. Поэтому, если вы видите, что в запросе # 2 используется индекс # 2, но всегда нужно делать много * ключевых поисков * для получения столбцов, было бы полезно узнать, может ли включение столбцов в индекс помочь пропустить этот дополнительный шаг –