Почему LIKE будет быстрее, чем =? - PullRequest
4 голосов
/ 05 ноября 2008

Сотрудник недавно столкнулся с ситуацией, когда запрос на поиск разрешений безопасности выполнялся за ~ 15 секунд с использованием = сравнения для идентификатора пользователя (который является уникальным идентификатором). Излишне говорить, что пользователи были менее впечатлены.

Из-за разочарования мой коллега изменил сравнение =, чтобы использовать LIKE, и запрос ускорился до 1 секунды.

Не зная ничего о схеме данных (у меня нет доступа к базе данных или планам выполнения), что может потенциально вызвать это изменение в производительности?

(Широкий и неопределенный вопрос, я знаю)

Ответы [ 5 ]

8 голосов
/ 05 ноября 2008

Другая возможность состоит в том, что это сложный запрос, и преобразование типа выполняется через оператор = для каждой строки. LIKE несколько меняет семантику, так что преобразование типов не должно иметь такой большой вес при планировании выполнения. Я бы посоветовал вашему коллеге взглянуть на план выполнения со значком = и посмотреть, есть ли что-то вроде

CONVERT(varchar, variable) = othervariable

на этапе выполнения. При неправильных обстоятельствах один тип передачи может замедлить запрос на два порядка.

8 голосов
/ 05 ноября 2008

Возможно, это был плохой план выполнения, который был кэширован; Переход на оператор LIKE просто вызвал создание нового плана выполнения. Такое же ускорение можно было бы заметить, если бы человек запустил sp_recompile для рассматриваемой таблицы, а затем повторно запустил запрос =.

1 голос
/ 05 ноября 2008

Что ж, если он запускал два запроса один за другим, то вполне вероятно, что данные должны были считываться с диска для первого запроса, но все еще находились в кэше данных СУБД для второго ...

Если это то, что произошло, то, если бы он запустил их в обратном порядке, он бы увидел противоположные результаты ... Если бы он использовал подобное с точным значением (без подстановочных знаков), тогда план запроса должен был быть идентичным ..

1 голос
/ 05 ноября 2008

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

Можете ли вы дать точное SQL?

Иногда функции могут помешать оптимизатору использовать индекс.

Сравните планы выполнения.

0 голосов
/ 05 ноября 2008

Вы пытались обновить статистику этой таблицы / базы данных? Может стоит попробовать.

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