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

StackOverflow https://stackoverflow.com/questions/2228192

Вопрос

Скажи, что у меня есть столик:

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

Запросы обычно направляются на Имя пользователя или Фамилия, но также и на Имя пользователя и Фамилия.

Если я создам некластеризованный индекс на Имя пользователя и еще один на Фамилия, тогда мои первые два запроса будут удовлетворены.По-видимому, SQL Server будет использовать пересечение индексов для другого запроса.

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top