SQL Server: есть ли потери производительности между операторами '=' и 'like'? - PullRequest
2 голосов
/ 17 ноября 2011

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 17 ноября 2011

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

Цитата (в случае отключения):

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

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

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

3 голосов
/ 17 ноября 2011

Это достаточно легко проверить.Я использовал таблицу с 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"> для =.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...