Оптимизация индексов с несколькими столбцами для запросов с несколькими столбцами на SQL Server - PullRequest
2 голосов
/ 16 ноября 2010

У меня есть одна таблица [таблица] с двумя столбцами, которые необходимо отфильтровать: [column1] и [column2].

В моей программе я выполняю запрос вроде:

select * from [table] where [column1] = 'foo' and [column2] = 'bar';

Что быстрее:

  1. Создание двух индексов, по одному на каждый столбец. ([column1] и [column2])
  2. Создание одного индекса, содержащего оба столбца. ([Столбец1] + [столбец2])

Этот вопрос некоторое время меня беспокоил, я не представляю, как работает оптимизация запросов и как SQL Server использует созданные индексы для ускорения запросов.

Ответы [ 2 ]

3 голосов
/ 16 ноября 2010

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

Комбинация двух значений создает гораздо более избирательные критерии.Кроме того, это помогает повысить производительность, поскольку для индекса покрытия не требуется BOOKMARK LOOKUP .

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

ОБНОВЛЕНИЕ

Помните, что если у вас есть индекс в виде column1 + coulmn2, поиск только по столбцу 2 не может использовать этот индекс, поэтому вам потребуется отдельный индекс дляа также column2.

3 голосов
/ 16 ноября 2010

Это зависит!

Это зависит от селективности этих столбцов.

Если бы вы не выбирали все столбцы '*', вы могли бы использоватьдействительно быстрый покрывающий индекс, состоящий из столбцов условия where и INCLUDE'ing столбцов в списке SELECT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...