Настройка производительности SQL для Oracle Многие ИЛИ против IN ()
У меня нет "объяснить план" под рукой. Не могли бы вы сказать, что из нижеперечисленного является более эффективным?
Опция 1:
select ...
from VIEW_ABC
where STRING_COL = 'AA'
OR STRING_COL = 'BB'
OR STRING_COL = 'BB'
OR ...
OR STRING_COL = 'ZZ'
Вариант 2:
select ...
from VIEW_ABC
where STRING_COL IN ('AA','BB',...,'ZZ')
4 ответа
Это похожий вопрос: В против ИЛИ Oracle, который быстрее?
Посмотрите на ответ OMG Ponies, он предполагает, что IN
более оптимизирован, чем OR
,
Есть также такой вопрос: IN vs OR в предложении SQL WHERE
Хотя он не является специфичным для базы данных, у него есть несколько хороших ответов с точки зрения Oracle.
Для чего это стоит, использование IN
было бы намного легче читать и, следовательно, легче поддерживать в долгосрочной перспективе. Это само по себе может повлиять на ваш выбор, особенно если (как я подозреваю) оптимизатор Oracle относится к ним обоим одинаково.
Однако, если ваш список значений очень большой, вам, вероятно, стоит поискать совершенно другой метод получения ваших результатов.
Я бы предположил, что оптимизатор будет обрабатывать обе версии одинаково. IN
на самом деле просто синтаксическая стенография для нескольких OR
заявления.
Оптимизатор Oracle преобразует IN-списки в OR-цепочки. Это позволяет вам выполнять преобразование OR-расширения, которое может дополнительно оптимизировать ваш запрос. Кроме того, он может генерировать транзитивные предикаты, которые могут ускорить запрос.
Имея все равные в двух запросах, конструкциях или преобразованиях, не будет разницы между использованием IN или OR. IN будет преобразован в цепочки OR.
Оптимизатор будет по-прежнему использовать и индексировать, если он существует в столбце String_Col. Чтобы поддерживать приемлемый размер SQL для облегчения синтаксического анализа, вместо того, чтобы Oracle анализировал строку символов 250-500, вам лучше поместить все возможные значения во временную таблицу или таблицу pl/sql, а затем объединить как этот -
Выберите /*+ упорядоченный use_nl(x) */ * из pl/sql_table, view_abc x, где x.string_col = pl/sql_table.value