Будет ли SQL Server использовать составной индекс, если в предложении WHERE указан только один столбец? - PullRequest
6 голосов
/ 09 февраля 2010

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

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 09 февраля 2010

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

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

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

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

1 голос
/ 09 февраля 2010

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

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

1 голос
/ 09 февраля 2010

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

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

...