2010-02-09 1 views
6

Скажем, у меня есть таблица:Будет ли SQL Server использовать составной индекс, если только один столбец находится в предложении WHERE?

CREATE TABLE Users (
    Id INT IDENTITY (1, 1), 
    FirstName VARCHAR(40), 
    LastName VARCHAR(40) 
) 

Запросы обычно на FirstName или LastName, но и на FirstNameиLastName.

Если я создаю некластеризованной индекс FirstName и другой на LastName, то мои первые два запроса удовлетворяются. По-видимому, SQL Server будет использовать index intersection для другого запроса.

В качестве альтернативы, если у меня есть indexees на (FirstName) и на (имя, фамилия), может/ли SQL Server использовать второй индекс для запросов на только LastName, а также запросов на обоих?

Сохраняет ли SQL Server составные части индекса слева направо или справа налево? Другими словами: построит ли он ключ как LastNameFirstName или FirstNameLastName? Или можно выбрать произвольно?

ответ

5

Может ли SQL Server использовать индекс (LastName, FirstName) для запросов только для LastName, а также для запросов на обоих?

Да, база данных будет использовать индекс (LastName, FirstName) для запросов по LastName. Он будет не использовать этот показатель для запросов только на FirstName.

Сохраняет ли он составные части индекса слева направо или справа налево?

Хранение находится в B-Tree. Независимо от того, считаете ли вы его сохранением справа налево или слева направо, это просто полезное средство визуализации и не связано с фактическим хранением данных.

+0

Я имею в виду: при построении ключа для ввода B-дерева, является ключом для составного индекса (A, B, C), хранящегося как (A, B, C) или (C, B, A), или это до SQL Server, чтобы выбрать один произвольно? –

+2

Я думаю, что он имеет в виду, как строится ключ. Anwer слева направо, точно так же, как вы определяете ключ. И поэтому он не может использоваться для поиска фамилии. –

1

Да, если вы запрашиваете только имя LastName, он должен использовать индекс (LastName, FirstName). Таким образом, он будет использоваться как при запросе по LastName, так и LastName и FirstName.

Общее руководство состоит в том, чтобы гарантировать, что столбец с наибольшей селективностью появляется сначала в составном индексе, так как это дает наибольшую выгоду/сужает набор результатов раньше, чем следующие, менее избирательные столбцы.

1

В зависимости от запроса, который вы отправляете, может использоваться составной индекс в двух столбцах, даже если вы ищете только 2-й столбец. Однако вы не получите индексный поиск, но скорее всего сканирование индекса. Если это «достаточно хорошо» для вас, зависит от вашей конкретной среды. Индексирование - это скорее искусство, чем наука, и на ваше решение о том, как индексировать таблицу, влияет множество факторов. Это всегда компромисс, поскольку слишком много индексов на столе так же плохо, как и слишком мало. Удостоверьтесь, что ваши наиболее важные вопросы хорошо освещены, а затем в каждом конкретном случае определяют, стоит ли какой-либо дополнительный индекс его стоимости.

Кроме того, поскольку он еще не упоминался и предоставлен вам, по крайней мере, на SQL Server 2005: позвольте мне включить предложение INCLUDE для некластеризованных индексов. Это упущенное, но действительно полезное дополнение к любой стратегии индексирования.

+0

+1 для упоминания индекса-поиска и индекса; также ВКЛЮЧАЙТЕ. –