Проблема в том, что SQL Server пытается построить ОДИН план выполнения, чтобы соответствовать всем параметрам.Это означает, что он не меняет своего мнения и выбирает другой индекс, когда вы задаете ему другие параметры.(Часть different index
важна, поскольку нагрузка переупорядочения неподходящего индекса может быть очень высокой.)
Единственный способ для этого - создать новый план выполнения, который включает динамический SQL- Именно то, что вы хотите избежать.
Однако;динамический SQL и SP_EXECUTESQL не обязательно плохая идея.Так как он также может быть параметризован, правильное использование позволяет повторное использование плана выполнения и может быть исключительно эффективным при решении подобных проблем.
Есть ли конкретная причина, по которой вам нужно избегать динамического SQL?
Единственный реальный обходной путь - это написать запрос несколько раз с разным порядком и выбрать, какой из них использовать с блоками T-SQL IF
.Это позволит оптимизатору генерировать различные планы выполнения.