Для типа данных Oracle NUMBER оператор LIKE против оператора BETWEEN..AND - PullRequest
0 голосов
/ 22 декабря 2011

Предположим, mytable - это таблица Oracle, и в ней есть поле с именем id . Тип данных id НОМЕР (8). Сравните следующие запросы:

select * from mytable where id like '715%'

и

select * from mytable where id between 71500000 and 71599999

Я думаю, что второе более эффективно, так как я думаю, что для сравнения чисел потребуется меньше инструкций на языке ассемблера, чем для сравнения строк. Мне нужно подтверждение или исправление. Пожалуйста, подтвердите / исправьте и добавьте любые дальнейшие комментарии, связанные с любым оператором.

ОБНОВЛЕНИЕ : Я забыл упомянуть 1 важную информацию. id в этом случае должно быть 8-значным числом.

Ответы [ 5 ]

7 голосов
/ 22 декабря 2011

Если вам нужны значения только между 71500000 и 71599999, тогда да, второй вариант гораздо эффективнее. Первый также будет возвращать значения между 7150-7159, 71500-71599 и т. Д. И т. Д. Вам нужно будет либо просмотреть ненужные результаты, либо написать еще пару строк кода, чтобы отфильтровать остальные. Второй вариант определенно более эффективен для того, что вы, похоже, хотите сделать.

7 голосов
/ 22 декабря 2011

Похоже, что план выполнения второго запроса более эффективен.

Первый запрос выполняет полное сканирование таблицы идентификаторов, тогда как второй запрос - нет.

MyТестовые данные:

План выполнения первого запроса:

enter image description here

План выполнения второго запроса:

enter image description here

1 голос
/ 22 декабря 2011

Мне не нравится идея использовать LIKE с числовым столбцом. Кроме того, это может не дать результаты, которые вы ищете. Если у вас есть значение 715000000, оно будет отображаться в результате запроса, даже если оно больше 71599999.

Кроме того, я не люблю между в принципе. Если вещь находится между двумя другими вещами, она не должна включать эти две другие вещи. Но это всего лишь личное раздражение. Я предпочитаю использовать> = и <=. Это позволяет избежать путаницы при чтении запроса. Кроме того, иногда мне приходится менять запрос на что-то вроде> = a и

Харв

0 голосов
/ 23 декабря 2011

Вы можете использовать математическую функцию, иначе вы должны использовать функцию to_char, чтобы использовать like, но это вызовет проблемы с производительностью.

выберите * из таблицы, где floor (id / 100000) = 715 или выберите * из таблицы, где floor (id / 100000) = TO_NUMBER ('715') // это параметрический

0 голосов
/ 22 декабря 2011

В дополнение к другим затронутым вопросам использование LIKE в том виде, в котором вы предлагаете, приведет к тому, что Oracle не будет использовать индексы для столбца ID из-за неявного преобразования данных из числа в символ, что приведет к полному сканированию таблицы при используя LIKE против сканирования индекса и диапазона при использовании BETWEEN. Предполагая, конечно, у вас есть индекс по ID. Однако даже если вы этого не сделаете, Oracle будет вынужден выполнять преобразование типов для каждого сканируемого значения в случае LIKE, а в другом - нет.

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