Несколько индексов против нескольких столбцов - PullRequest
562 голосов
/ 07 октября 2008

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

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

Например

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

Versus

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 ]

279 голосов
/ 07 октября 2008

Я согласен с Cade Roux .

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

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

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

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

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

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

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

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

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

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

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

69 голосов
/ 07 октября 2008

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

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

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

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

35 голосов
/ 07 октября 2008

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

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

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

17 голосов
/ 07 октября 2008

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

7 голосов
/ 07 октября 2008

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

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

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

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

...