sql - элемента - контент-менеджер. информационные блоки ответы




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

Эта

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» для проверки равенства? Вы можете сэкономить, нажав клавишу shift, и все, кто читает скрипт, начинают путаться.


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

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

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

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


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

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

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, для чего-либо, кроме хранилища данных или других операций с объемными данными.

Возьмем случай:

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE :b1

Oracle не может знать, что значение: b1 равно «% some_value%» или «some_value» и т. Д. До времени выполнения, поэтому он будет оценивать мощность результата на основе эвристики и разработать соответствующий план, который либо может или не может быть пригодным для различных значений: b, таких как «% A», «%», «A» и т. д.

Подобные проблемы могут применяться с предикатом равенства, но диапазон мощностей, который может возникнуть, гораздо легче оценивается на основе статистики столбцов или наличия уникального ограничения, например.

Поэтому лично я не стал бы использовать LIKE в качестве замены для =. Оптимизатор довольно легко иногда обманывать.







oracle