В одном из ваших комментариев вы сказали:
"Также я проверил различные значения связывания. С переменными связывания я получаю несколько полных сканирований, тогда как с жестко закодированными значениями план выглядит очень многолучше. "
Есть два пути.Если вы передаете NULL для параметров, то вы выбираете все записи.В этих условиях полное сканирование таблицы является наиболее эффективным способом получения данных.Если вы передаете значения, то индексированное чтение может быть более эффективным, потому что вы выбираете только небольшое подмножество информации.
Когда вы формулируете запрос, используя переменные связывания, оптимизатор должен принять решение: должен ли он предполагать, что большую часть времени вы будете передавать значения или что вы будете передавать нули?Сложно.Посмотрите на это по-другому: неэффективнее ли выполнять полное сканирование таблицы, когда вам нужно только выбрать подмножество записей, или выполнять индексированное чтение, когда вам нужно выбрать все записи?
Похоже, что оптимизатор отключил полное сканирование таблицы как наименее неэффективную операцию, чтобы охватить все возможные случаи.
В то время как при жестком кодировании значений оптимизатору сразу становится известно, что 10 IS NULL
оценивается как ЛОЖЬ, и поэтому он может взвесить преимущества использования индексированных операций чтения для поиска нужных записей подмножества.
Итак, что делать?Поскольку вы говорите, что этот запрос выполняется только один раз в месяц, я думаю, что для выполнения отдельных запросов потребуется лишь небольшое изменение бизнес-процессов: один для всех организаций и один для подмножества организаций.
"Кстати, удаление предложения: R1 IS NULL не сильно меняет план выполнения, что оставляет меня с другой стороны условия OR: R1 <= org.no, где NULL в любом случае не имеет смысла, поскольку org.no не равен NULL "</p>
Хорошо, значит, у вас есть пара переменных связывания, которые задают диапазон .В зависимости от распределения значений разные диапазоны могут соответствовать разным планам выполнения.То есть этот диапазон (вероятно) подойдет для сканирования с индексированным диапазоном ...
WHERE org.id BETWEEN 10 AND 11
... тогда как он, скорее всего, будет более приспособлен для сканирования полной таблицы ...
WHERE org.id BETWEEN 10 AND 1199999
Именно здесь вступает в игру Bind Variable Peeking.
(конечно, в зависимости от распределения значений).