Настройка производительности 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

Другие вопросы по тегам