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 будет использовать индексное пересечение для другого запроса.

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

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

6
задан Roger Lipscombe 9 February 2010 в 10:41
поделиться

3 ответа

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

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

Хранится ли составная часть индекса слева направо или справа налево?

Хранится ли составная часть индекса в B-дереве . Считаете ли вы, что оно хранится справа налево или слева направо, - это просто полезное средство визуализации, не имеющее отношения к фактическому хранению данных.

5
ответ дан 17 December 2019 в 00:09
поделиться

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

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

1
ответ дан 17 December 2019 в 00:09
поделиться

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

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

1
ответ дан 17 December 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: