Множественные индексы против многоколоночных индексов

Я только что добавлял индекс в таблицу в 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)
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
695
0
326 972
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

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

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

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

evilhomer 07.10.2008 19:54

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

It's a trap 18.03.2016 13:22

@RachitGupta Один индекс с обоими столбцами

Cade Roux 18.03.2016 13:24

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

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

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

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

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

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

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

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

TToni 07.10.2008 19:54
Ответ принят как подходящий

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Maxim Zaslavsky 27.07.2010 23:09

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

Ian R. O'Brien 29.01.2013 18:40

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

jball 30.01.2013 02:02

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

PerformanceDBA 16.11.2019 02:37

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

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

RobM 12.08.2011 14:06

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