Я только что добавлял индекс в таблицу в 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)





да. Я рекомендую вам проверить Статьи Кимберли Трипп об индексировании.
Если индекс «покрывает», тогда нет необходимости использовать что-либо, кроме индекса. В SQL Server 2005 вы также можете добавить в индекс дополнительные столбцы, которые не являются частью ключа, что может устранить переходы к остальной части строки.
Наличие нескольких индексов, каждый в одном столбце, может означать, что вообще будет использоваться только один индекс - вам нужно будет обратиться к плану выполнения, чтобы увидеть, какие эффекты предлагают различные схемы индексирования.
Вы также можете использовать мастер настройки, чтобы определить, какие индексы позволят выполнить данный запрос или рабочую нагрузку наилучшим образом.
@CadeRoux Если в большинстве случаев в моем предложении where есть 2 столбца в отношении '&', будет ли лучше иметь индекс с несколькими столбцами для них или индекс с одним столбцом для обоих из них
@RachitGupta Один индекс с обоими столбцами
Если у вас есть запросы, которые будут часто использовать относительно статический набор столбцов, создание единого покрывающего индекса, включающего их все, значительно повысит производительность.
Помещая несколько столбцов в ваш индекс, оптимизатору нужно будет напрямую обращаться к таблице только в том случае, если столбец отсутствует в индексе. Я часто использую их в хранилищах данных. Обратной стороной является то, что это может стоить больших накладных расходов, особенно если данные очень изменчивы.
Создание индексов для отдельных столбцов полезно для операций поиска, часто встречающихся в системах OLTP.
Вы должны спросить себя, зачем вы индексируете столбцы и как они будут использоваться. Запустите несколько планов запросов и посмотрите, когда к ним обращаются. Настройка индекса - это такой же инстинкт, как и наука.
Многостолбцовый индекс можно использовать для запросов, ссылающихся на все столбцы:
SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3
Это можно найти напрямую, используя многостолбцовый индекс. С другой стороны, можно использовать не более одного индекса с одним столбцом (ему нужно будет найти все записи, имеющие Column1 = 1, а затем проверить Column2 и Column3 в каждой из них).
Это правильно. Однако использование этих столбцов в виде единого индекса все равно значительно ускорит процесс. Обычно одно из значений в столбцах уменьшает результирующий набор настолько, что не имеет значения искать остальные без индекса, и оптимизатор хорошо подбирает это значение.
Я согласен с Кейд Ру.
Эта статья должна направить вас на верный путь:
Следует отметить, что кластерные индексы должны иметь уникальный ключ (столбец идентификации, который я бы рекомендовал) в качестве первого столбца. В основном это помогает вставлять данные в конец индекса и не вызывать большого количества операций ввода-вывода на диске и разбиения страниц.
Во-вторых, если вы создаете другие индексы для своих данных и они грамотно построены, они будут использоваться повторно.
например представьте, что вы ищете в таблице по трем столбцам
состояние, округ, почтовый индекс.
Затем индекс со штатом, округом, почтовым индексом. будет использоваться во всех трех этих поисках.
Если вы выполняете поиск по одному только zip довольно часто, то указанный выше индекс не будет использоваться (в любом случае SQL Server), поскольку zip является третьей частью этого индекса, и оптимизатор запросов не увидит этот индекс как полезный.
Затем вы можете создать индекс только на Zip, который будет использоваться в этом случае.
Кстати, Мы можем воспользоваться тем фактом, что при многоколоночной индексации первый столбец индекса всегда можно использовать для поиска., и когда вы выполняете поиск только по «состоянию», он эффективен, но все же не так эффективен, как одноколоночный индекс в «состоянии».
Я предполагаю, что ответ, который вы ищете, заключается в том, что он зависит от ваших предложений where ваших часто используемых запросов, а также от вашей группы by.
Статья очень поможет. :-)
Так что лучше всего было бы определить индекс для штата, округа и почтового индекса в дополнение к индивидуальному индексу для каждого столбца?
@jball Я что-то здесь упускаю? Похоже, статья в основном посвящена различиям между ограничениями версий SQL Server. Не могла ли статья быть перемещена?
@Ian, похоже, что что-то было потеряно в ближайшие 3 года с тех пор, как я разобрал исходную ссылку с этого момента более 4 лет назад. Я могу сказать вам, что сообщение в блоге имеет правильный заголовок, на который ссылается evilhomer, но похоже, что последующие блоги в этой серии уже нелегко найти из этого первого сообщения. Вам нужно будет просмотреть архив блога Кимберли, чтобы увидеть, сможете ли вы найти других в этой серии.
1) «В основном [кластерный индекс со столбцом IDENTITY в качестве первого] помогает вставлять данные в конец индекса» является правильным. "и не вызывать большого количества операций ввода-вывода на диске и разбиения страниц" абсолютно неверно в многопользовательской системе. По правде говоря, это высокая конкуренция гарантии (низкий уровень параллелизма) в многопользовательской системе. 2) Кластерный индекс должен быть реляционным ключом, т.е. нет и IDENTITY, GUID, etc. 3) «Тогда во всех трех поисках будет использоваться индекс с указанием штата, округа, почтового индекса». ложно и противоречит «первый столбец можно использовать». Вторые и дополнительные столбцы в индексе не используются для поиска.
Один пункт, который, похоже, был упущен, - это превращения звезд. Операторы Индекс пересеченияoperators разрешают предикат, вычисляя набор строк, пораженных каждым из предикатов, до того, как любой ввод-вывод будет выполнен в таблице фактов. В звездообразной схеме вы должны индексировать каждый отдельный ключ измерения, и оптимизатор запросов может решить, какие строки выбрать, вычислением пересечения индексов. Индексы отдельных столбцов обеспечивают для этого максимальную гибкость.
+1 за связанное хорошее объяснение того, как используются (обычные) индексы, относящиеся к вопросу.
Кимберли Трипп знает, о чем говорит. Я был на ее разговоре, и она знает все это наизнанку. Отличный совет.