SQL Server: есть ли накладные расходы на производительность между операторами «=» и «как»?

Есть ли разница в производительности между этими двумя запросами?

--= operator SELECT COL1, COL2 FROM DBO.MYTABLE WHERE COL1 = '1' --like operator SELECT COL1, COL2 FROM DBO.MYTABLE WHERE COL1 LIKE '1' 

В принципе использование LIKE в этом случае неверно, но механизм базы данных принимает это.

Оформить следующий пост .

Ответить (в случае, если он выходит в автономном режиме):

Мой ответ коленного рефлекса заключался в том, что = будет быстрее, но я подумал об этом и понял, что оптимизатор запросов действительно будет рассматривать их как одно и то же. Это подтвердило проверку планов запросов против быстро созданного tbFoo. Вот что я ему сказал.

За исключением того, что через мгновение я понял, что существует серьезная оговорка – оптимизация запроса зависит от того, как параметр параметризуется. Если это чисто специальный SQL и скомпилирован во время выполнения, то утверждения эквивалентны, но если будет повторное использование плана, либо включив оператор в сохраненный процесс, либо подготовив его и выполнив через sp_executesql, LIKE наложит существенный штраф.

Это связано с тем, что во время компиляции оптимизатор не знает, будет ли параметр для оператора LIKE содержать дикую карту, поэтому он не может использовать более конкретную оптимизацию (включая выбор индекса), которую он мог бы использовать с оператором =. Поэтому, если вы в основном передаете параметры без подстановочных знаков, вы будете выполнять субоптимальный план запроса. Помните об этом при разработке вашего запроса!

Это достаточно легко проверить. Я использовал таблицу с 6000000 строк, сравнивая с = и like против поля nvarchar , которое не индексируется.

Используя like 'xx'

 SQL Server Execution Times: CPU time = 6416 ms, elapsed time = 493 ms. 

Использование = 'xx'

  SQL Server Execution Times: CPU time = 3444 ms, elapsed time = 212 ms. 

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

Используя like 'xx%'

  SQL Server Execution Times: CPU time = 3168 ms, elapsed time = 296 ms. 

Использование дикой карты спереди – другое дело.

Используя like '%xx'

  SQL Server Execution Times: CPU time = 18017 ms, elapsed time = 1530 ms. 

Все эти тесты выполняются без индекса в столбце, поэтому я фактически сравниваю здесь внутреннюю операцию, которая сравнивается с аналогичным сравнением. В плане выполнения они <Intrinsic FunctionName="like"> для like и <Compare CompareOp="EQ"> for = .

Планы запросов «выглядят» одинаково для использования, like без % и и = но это не так. like все еще использует <Intrinsic FunctionName="like"> даже без % .

Давайте будем гением компьютера.