Я не видел планов выполнения, но я сильно подозреваю, что они отличаются в этих двух случаях. Проблема, с которой вы столкнулись, заключается в том, что в случае A (более быстрый запрос) оптимизатор знает значение, которое вы используете для идентификатора списка (1234) и, используя комбинацию статистики распределения и индексов, выбирает оптимальный план.
Во втором случае оптимизатор не может прослушать значение идентификатора и, следовательно, создает план, который будет приемлем для любого переданного в списке идентификатора. И там, где я говорю «приемлемый», я не имею в виду «оптимальный».
Так что вы можете сделать, чтобы улучшить сценарий? Здесь есть несколько альтернатив:
1) Создайте хранимую процедуру для выполнения запроса, как показано ниже:
СОЗДАНИЕ ПРОЦЕДУРЫ Foo
@Id INT
КАК
ВЫБЕРИТЕ другие атрибуты. * ИЗ списка контактов ПРИСОЕДИНЯЙТЕСЬ к другим атрибутам
ON listcontacts.contactId = otherattributes.contactId ГДЕ listcontacts.listid = @Id
ЗАКАЗАТЬ по названию ASC
GO
Это позволит оптимизатору прослушать значение входного параметра при его передаче и создать соответствующий план выполнения для первого выполнения. К сожалению, он будет кешировать этот план для повторного использования позже, так что если вы обычно не вызываете sproc с подобными выборочными значениями, это может вам не сильно помочь
2) Создайте хранимую процедуру, как указано выше, но укажите, что она будет с RECOMPILE. Это обеспечит повторную компиляцию хранимой процедуры при каждом ее выполнении и, следовательно, создание нового плана, оптимизированного для этого входного значения
3) Добавьте OPTION (RECOMPILE) в конец оператора SQL. Вызывает перекомпиляцию этого оператора и может оптимизировать для входного значения
4) Добавьте OPTION (OPTIMIZE FOR (@Id = 1234)) в конец оператора SQL. Это приведет к оптимизации плана, который кэшируется, для этого конкретного входного значения. Прекрасно, если это очень распространенное значение, или наиболее распространенные значения подобны селективным, но не настолько велики, если распределение селективности более широко распространено.