Ответ
scaisEdge предоставляет конкретное c решение, но также стоит изучить общую c причину, по которой условия OR
в соединениях могут вызывать проблемы с производительностью - условия OR
не позволяют оптимизатору использовать соединения ha sh.
Ha sh объединения обычно являются самым быстрым способом объединить большой процент данных. (Ваши таблицы могут быть небольшими, но, поскольку нет фильтров, они обрабатывают большой процент данных.) Но ha sh объединений могут работать только с условиями равенства. Чтобы обработать условие OR
, Oracle должен будет использовать более медленный метод соединения, такой как сортировка слияния или вложенный l oop.
Если вы думаете о количестве строк из двух таблиц как M
и N
, соединение ha sh может (теоретически) выполняться в операциях M+N
, тогда как объединение слияния сортировки может выполняться в M*LOG(N)
. Если вам интересно, этот пример главы содержит более подробную информацию о различных типах соединения Oracle и о том, как их производительность сравнивается.
Версия UNION
должна присоединяться к таблицам дважды , но два быстрых соединения могут быть лучше одного медленного. Oracle не всегда может преобразовать OR
в UNION
или UNION ALL
, потому что эти две версии могут не обязательно возвращать те же строки, что и другие ваши запросы. Например, альтернативы UNION
по-разному обрабатывают повторяющиеся строки. (Но, возможно, вы знаете что-то о своих данных, чего не знает Oracle, поэтому запросы все равно могут работать для вас.)
Это знание полезно, потому что OR
не является медленным по своей сути, и мы этого не делаем. Я всегда хочу этого избежать. Если OR
- это просто часть доступа к индексу или часть соединения, которое в любом случае не будет использовать соединение ha sh, тогда в этом нет ничего плохого.