Несколько индексов против нескольких столбцов


646

Я только что добавил индекс в таблицу в SQL Server 2005, и это заставило меня задуматься. В чем разница между созданием 1 индекса и определением нескольких столбцов по сравнению с наличием 1 индекса на столбец, который вы хотите проиндексировать.

Есть ли определенные причины, по которым один должен использоваться поверх другого?

Например

Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)

Против

Create NonClustered Index IX_IndexName1 On TableName
(Column1 Asc)

Create NonClustered Index IX_IndexName2 On TableName
(Column2 Asc)

Create NonClustered Index IX_IndexName3 On TableName
(Column3 Asc)

Ответы:


319

Я согласен с Кейд Ру .

Эта статья должна вывести вас на правильный путь:

Следует отметить, что кластеризованные индексы должны иметь уникальный ключ (столбец идентификаторов, который я бы рекомендовал) в качестве первого столбца. В основном это помогает вставлять данные в конец индекса и не вызывает много дискового ввода-вывода и разбиения страницы.

Во-вторых, если вы создаете другие индексы для ваших данных, и они построены умно, они будут использованы повторно.

например, представьте, что вы ищете таблицу по трем столбцам

штат, округ, почтовый индекс.

  • Вы иногда ищете только по штатам.
  • Вы иногда ищете по штатам и округам.
  • Вы часто ищете по штатам, округам, почтовым индексам.

Тогда индекс с государством, графством, почтовым индексом. будет использоваться во всех трех из этих поисков.

Если вы будете выполнять поиск по одному только zip-файлу, то вышеупомянутый индекс не будет использоваться (в любом случае SQL Server), поскольку zip является третьей частью этого индекса, и оптимизатор запросов не посчитает этот индекс полезным.

Затем вы можете создать индекс только на Zip, который будет использоваться в этом случае.

Кстати, мы можем воспользоваться тем фактом, что при многоколоночной индексации первый столбец индекса всегда можно использовать для поиска, а при поиске только по «состоянию» он эффективен, но все же не так эффективен, как индекс по одному столбцу в «состоянии». '

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

Статья очень поможет. :-)


2
Так что лучше всего было бы определить индекс для штата, округа и почтовый индекс в дополнение к отдельному индексу для каждого столбца?
Максим Заславский

12
@jball Я что-то здесь упускаю? Похоже, что статья посвящена главным образом различиям между версиями SQL Server. Может быть статья была перенесена?
Ян Р. О'Брайен

@ Похоже, что что-то было потеряно в течение ближайших 3 лет, так как я перебрал исходную ссылку более 4 лет назад. Я могу вам сказать, что у блога есть правильный заголовок, на который ссылается evilhomer, но похоже, что последующие блоги этой серии уже не так легко найти из этого первого поста. Вам придется заглянуть в архив блога Кимберли, чтобы узнать, сможете ли вы найти других в серии.
Jball

1
1) «В основном [кластерный индекс с IDENTITY в качестве первого столбца] помогает вставить данные в конец индекса» правильно. «и не вызывать много дисковых операций ввода-вывода и разбиения страницы» совершенно неверно в многопользовательской системе. По правде говоря, это гарантирует высокую конкуренцию (низкий параллелизм) в многопользовательской системе. 2) Кластерный индекс должен быть реляционным ключом, т.е. не ан IDENTITY, GUID, etc. 3) «Тогда индекс с указанием штата, округа, почтового индекса будет использоваться во всех этих трех поисках». ложно и противоречит "первый столбец пригоден для использования". Вторые столбцы & столбцы в индексе недоступны для поиска.
ПроизводительностьDBA

81

Да. Я рекомендую вам ознакомиться со статьями Кимберли Триппа по индексации .

Если индекс «покрывает», то нет необходимости использовать что-либо, кроме индекса. В SQL Server 2005 вы также можете добавить в индекс дополнительные столбцы, которые не являются частью ключа, что может исключить поездки к остальной части строки.

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

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


7
Кимберли Трипп знает, о чем она говорит. Я разговаривал с ней, и она знает все это наизнанку. Отличный совет.
evilhomer

@CadeRoux Если в моем предложении where 2 столбца в соотношении '&' в большинстве случаев будет лучше иметь многостолбцовый индекс или одинарный столбец на обоих
это ловушка

2
@RachitGupta Один указатель с обеими колонками
Cade Roux

40

Многостолбцовый индекс можно использовать для запросов, ссылающихся на все столбцы:

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3

Это можно посмотреть напрямую с помощью индекса из нескольких столбцов. С другой стороны, можно использовать не более одного индекса, состоящего из одного столбца (для этого нужно найти все записи, имеющие Column1 = 1, а затем проверить Column2 и Column3 в каждой из них).


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

16

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


+1 за хорошее объяснение того, как используются (обычные) индексы, относящиеся к вопросу.
RobM

7

Если у вас есть запросы, которые будут часто использовать относительно статический набор столбцов, создание единого индекса покрытия, включающего их все, значительно повысит производительность.

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

Создание индексов для отдельных столбцов полезно для операций поиска, часто встречающихся в системах OLTP.

Вы должны спросить себя, почему вы индексируете столбцы и как они будут использоваться. Запустите несколько планов запросов и посмотрите, когда к ним обращаются. Индексная настройка - такой же инстинкт, как и наука.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.