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

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

5 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Книга Лахденмаки и Лича "Разработка индекса реляционных баз данных и оптимизаторы" представляет трехзвездную систему для оценки того, насколько индекс подходит для запроса.

  1. Индекс зарабатывает одну звезду, если он размещает соответствующие строки рядом друг с другом
  2. вторая звезда, если ее строки отсортированы в порядке, необходимом для запроса
  3. конечная звезда, если она содержит все столбцы, необходимые для запроса

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

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