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

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)
GateKiller
источник

Ответы:

319

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

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

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

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

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

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

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

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

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

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

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

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

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

evilhomer
источник
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 в каждой из них).

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

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

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

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

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

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

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

Боб Пробст
источник