Почему SQL игнорирует подсказку индекса и выбирает другой индекс?

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

Select value From SomeTable wITH (INDEX(IV_Sort_Asc))
Select value From SomeTable wITH (INDEX(IV_Sort_Desc))

Я столкнулся со случаем в SQL Server 2008, когда подсказки игнорируются, и в обоих случаях вместо первого используется индекс IV_Sort_Desc.

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

Что может вызвать это и что я могу сделать, чтобы это исправить? Конечно, вы ожидаете, что SQL Server примет подсказку индекса и не будет использовать другую?


person Middletone    schedule 23.05.2013    source источник
comment
Итак, как мне заставить его использовать определенный индекс? Я ищу команду, а не подсказку.   -  person Middletone    schedule 23.05.2013
comment
У меня очень большие проиндексированные представления, и я использую индекс, поскольку он предварительно отсортирован. Если бы я запустил команду сортировки для 10+ миллионов строк, я бы сидел здесь целую вечность. Тщательно формируя запрос и используя правильный индекс, он возвращает почти мгновенные результаты, проблема в том, что в этом конкретном случае (индексы в индексированном представлении) он больше не учитывает параметры, которые я ему предоставил.   -  person Middletone    schedule 23.05.2013
comment
Глядя на документацию, я догадываюсь, что SQL Server не смог разработать правильный план выполнения с использованием этого индекса. Были ли возвращены какие-либо предупреждения?   -  person Justin    schedule 04.06.2013
comment
Нет, я проверил план запроса. В конце концов я вернулся к одному индексу, и сервер правильно его подхватил. Я все еще немного озадачен этим.   -  person Middletone    schedule 05.06.2013


Ответы (1)


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

WITH (FORCESEEK, INDEX (IndexName),NOEXPAND)

https://technet.microsoft.com/en-us/library/bb510478%28v=sql.105%29.aspx

person Roeland    schedule 31.12.2015