sql элемента Любое влияние производительности на Oracle для использования LIKE 'string' vs='string'?




контент-менеджер. информационные блоки ответы (5)

Если это правда, мой вопрос в том, зачем когда-либо использовать «=»?

Лучший вопрос: если это правда, зачем использовать «LIKE» для проверки равенства? Вы можете сэкономить, нажав клавишу shift, и все, кто читает скрипт, начинают путаться.

Эта

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE '%some_value%';

медленнее, чем это

SELECT * FROM SOME_TABLE WHERE SOME_FIELD = 'some_value';

но как насчет этого?

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE 'some_value';

Мое тестирование показывает, что второй и третий примеры точно такие же. Если это правда, мой вопрос в том, зачем когда-либо использовать «=»?


LIKE '% WHATEVER%' должен будет выполнить полное сканирование индекса.

Если нет процентов, то он действует как равный.

Если% находится на одном конце, то индекс может быть сканированием диапазона.

Я не уверен, как оптимизатор обрабатывает связанные поля.


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

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


like формально то же самое, если у вас нет таких символов, как $% т. д., поэтому не удивительно, что он имеет одинаковую стоимость.

Я нахожу Дэвида Олдриджа интересным, поскольку ваше приложение должно использовать переменные связывания. С like '%foobar' вы не можете использовать порядок в индексе. Если запрос предварительно скомпилирован, это приведет к большему индексу или таблице полного сканирования.

Кроме того, я нахожу это опасным, так как это может привести к SQL-инъекциям и странным ошибкам (например, если есть пользователь, называемый john, хакер может создать пользователя с именем 'joh$' и попытаться войти в систему)

зачем рисковать? '=' более ясен и не имеет ни одной из этих проблем.


Ты это пробовал? Тестирование - единственный верный способ узнать.

Как ни в стороне, ни одно из этих утверждений не обязательно будет возвращать одни и те же строки. Проверять:

insert into some_table (some_field) values ('some_value');
insert into some_table (some_fieled) values ('1some_value2');
insert into some_table (some_field) values ('some1value');

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE '%some_value%';

SELECT * FROM SOME_TABLE WHERE SOME_FIELD = 'some_value';

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE 'some_value';

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





oracle