SQL LIKE без подстановочных символов эквивалентен '='?
Я понимаю, что это довольно простой вопрос, и я, кажется, знаю на него ответ... но хотел бы уточнить.
Действительно ли эти запросы эквивалентны?
SELECT * FROM FOO WHERE BAR LIKE 'X'
SELECT * FROM FOO WHERE BAR ='X'
Возможно, есть накладные расходы при использовании оператора LIKE без подстановочных знаков?
У меня есть приложение, которое опционально использует LIKE и подстановочные знаки. Сейчас хранимая процедура использует LIKE и добавляет подстановочные знаки, но я думаю обновить запрос так, чтобы использовать LIKE, а приложение добавляло бы подстановочные знаки по мере необходимости.
3 ответ(ов)
Как упоминает @ocdecio, если оптимизатор достаточно умный, разницы не должно быть. Однако, если вы хотите убедиться в том, что происходит "за кулисами", вам следует сравнить планы выполнения двух запросов.
Любой хороший оптимизатор сведет первое выражение ко второму.
В одном случае я заметил, что использование LIKE
было в 20-125 раз быстрее, чем использование =
. Это показывает, что обсуждение возможностей оптимизатора на уровне теории — не так просто, как может показаться, и люди зачастую переоценивают "умные" возможности этих инструментов, даже для довольно простых задач.
Речь идет о базе данных с примерно 50 миллионами строк.
Для начала, необходимо создать триграммный GIN индекс:
CREATE EXTENSION pg_trgm;
CREATE INDEX ON profiles USING gin (username gin_trgm_ops);
После этого один запрос выполняется за 200 мс
, в то время как другой — за 4-25 секунд
:
SELECT userid, username, country FROM profiles WHERE username LIKE 'someuser';
SELECT userid, username, country FROM profiles WHERE username='someuser';
Таким образом, для фильтрации с использованием LIKE
с триграммным индексом мы получаем значительное ускорение по сравнению с прямым сравнением =
. Это подчеркивает важность правильного выбора подхода к индексации в зависимости от характерных запросов к базе данных.
'LIKE ('%this%' ИЛИ '%that%') и что-то=другое' не работает
SQL Server: Использование подстановочных знаков в операторе IN
Возможно ли задать условия в Count()?
Выполнение SQL из файла в SQLAlchemy
Параметризованные запросы с условиями LIKE и IN