0

SQL LIKE без подстановочных символов эквивалентен '='?

18

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

Действительно ли эти запросы эквивалентны?

SELECT * FROM FOO WHERE BAR LIKE 'X'
SELECT * FROM FOO WHERE BAR ='X'

Возможно, есть накладные расходы при использовании оператора LIKE без подстановочных знаков?

У меня есть приложение, которое опционально использует LIKE и подстановочные знаки. Сейчас хранимая процедура использует LIKE и добавляет подстановочные знаки, но я думаю обновить запрос так, чтобы использовать LIKE, а приложение добавляло бы подстановочные знаки по мере необходимости.

3 ответ(ов)

0

Как упоминает @ocdecio, если оптимизатор достаточно умный, разницы не должно быть. Однако, если вы хотите убедиться в том, что происходит "за кулисами", вам следует сравнить планы выполнения двух запросов.

0

Любой хороший оптимизатор сведет первое выражение ко второму.

0

В одном случае я заметил, что использование 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 с триграммным индексом мы получаем значительное ускорение по сравнению с прямым сравнением =. Это подчеркивает важность правильного выбора подхода к индексации в зависимости от характерных запросов к базе данных.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь