У вас есть 800k строк, проиндексированных col1, col2, col3. Col2 немного, поэтому его селективность составляет 50%. Col3 - это проверенный диапазон (<=), поэтому его селективность тоже будет примерно на 50%. Который оставляет кол1. Запрос составлен для общего параметризованного плана, поэтому он должен учитывать общий случай. Если у вас есть 10 различных значений col1, то ваш индекс вернет приблизительно 800k / 10 * 25%, что составляет ~ 20k ключей для поиска в кластеризованном индексе для получения части '...'. Если у вас есть 10 000 различных значений col1, то индекс вернет только 20 ключей для поиска. Как видите, важно не то, как вы строите свой индекс в этом случае, а фактические данные. В зависимости от избирательности col1 оптимизатор выберет план на основе сканирования кластерного индекса (лучше, чем 20 тыс. Ключевых поисков, каждый поиск стоит <em>по крайней мере 3-5 просмотров страниц) или один на основе на некластеризованном индексе (если col1 достаточно избирателен). В реальной жизни распределение col1 также играет роль, но это слишком усложнит объяснение.
Вы можете воспользоваться ретроспективным прогнозом и заявить, что план неверен, но план является наилучшей оценкой стоимости, основанной на данных, доступных на момент компиляции. Вы можете повлиять на него с помощью подсказок (индексная подсказка, как вы предлагаете, или оптимизировать подсказки, как подсказывает Кассной), но тогда ваш запрос может работать лучше для вашего набора тестов и намного хуже для другого набора данных, например, для случая, когда @ col1 = <the value that matches 500k records>
. Вы также можете создать индексное покрытие, исключив, таким образом, «...» в списке проекций, который требует поиска кластеризованного индекса, и в этом случае некластеризованный индекс всегда лучше соответствует стоимости, чем кластеризованное сканирование.
Кимберли Трипп (Kimberley Tripp) имеет статью в блоге, посвященную этой теме, она называет ее «переломным моментом индекса », в котором объясняется, почему игнорируется явно превосходный индекс кандидата: некластеризованный индекс, который не распространяется на список проекций и имеет плохую селективность будет рассматриваться как более дорогостоящий, чем кластерное сканирование.