SQL Server не использует определенный индекс - PullRequest
0 голосов
/ 19 июня 2019

У меня есть 2 типа запросов.Во-первых, нужно взять группу строк по groupId и некоторым дополнительным критериям (требуется несколько индексов), а во-вторых, нужно взять строку по id.Тем не менее, первый тип запроса использует индекс, в котором нет groupId, и занимает некоторое время.

В данный момент я отключил (id, ...) индекс, но мне нужно его включитьвернуться в какой-то момент.

Мои индексы:

ix1_groupId_id2_id3_ival_iid
ix2_groupId_id3_id2_ival_iid
pk_id

Я хочу написать что-то вроде этого:

SELECT id2, COUNT(*)
FROM table (WITHOUT(INDEX(pk_id))
WHERE groupId=x
GROUP BY id2

Как сказать SQL Server, что онне будет использовать индекс pk_id?

1 Ответ

2 голосов
/ 19 июня 2019

В SQL Server нет способа исключить индекс для рассмотрения оптимизатором запросов. Однако вы можете использовать ключевое слово WITH, чтобы указать, какой индекс вы хотите. Например, чтобы заставить запрос использовать индекс ix1_groupId_id2_id3_ival_iid:

SELECT id2, COUNT(*)
FROM table (WITH(INDEX(ix1_groupId_id2_id3_ival_iid))
WHERE groupId=x
GROUP BY id2

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

Индексные подсказки вводят неожиданные зависимости кода на схеме. Если кто-то захочет изменить имя индекса в будущем, он может не осознавать, что этот запрос запрашивает индекс по имени, поэтому теперь запрос не будет работать, пока не будет использовано новое имя.

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