Множественные индексы и индексы с несколькими колонками

Я только что добавлял индекс в таблицу в SQL Server 2005, и это заставило меня задуматься. В чем разница между созданием индекса 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)
+508
источник поделиться
6 ответов

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

В этой статье вы попадете на правильный путь:

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

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

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

состояние, округ, zip.

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

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

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

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

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

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

+245
источник

Да. Я рекомендую вам проверить статьи Kimberly Tripp по индексированию.

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

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

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

+62
источник

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

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

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

+31
источник

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

+13
источник

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

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

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

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

+5
источник

В книге Lahdenmaki and Leachs "Дизайн индекса реляционных баз данных и оптимизаторы" вводится трехзвездочная система для оценки того, насколько подходящим является индекс для запроса.

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

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос