Вы можете точно настроить поведение оптимизатора, установив системную переменную optimizer_switch :
Системная переменная optimizer_switch позволяет контролировать поведение оптимизатора. Его значение представляет собой набор флагов, каждый из которых имеет значение включения или выключения, чтобы указать, включено или отключено соответствующее поведение оптимизатора. Эта переменная имеет глобальные значения и значения сеанса и может быть изменена во время выполнения. Глобальное значение по умолчанию может быть установлено при запуске сервера.
[...]
Блочные флаги с вложенными циклами
block_nested_loop (по умолчанию включено)
Управляет использованием алгоритма соединения BNL.
Чтобы полностью отключить блокировку вложенного объединения и использовать значения по умолчанию для всего остального, вы можете использовать
SET optimizer_switch='block_nested_loop=off';
Альтернативой является использование Советов оптимизатора ,
Другой способ управления оптимизатором - использование подсказок оптимизатора, которые можно указать в отдельных инструкциях. Поскольку подсказки оптимизатора применяются для каждого оператора, они обеспечивают более точный контроль над планами выполнения операторов, чем это может быть достигнуто с помощью optimizer_switch. Например, вы можете включить оптимизацию для одной таблицы в операторе и отключить оптимизацию для другой таблицы. Подсказки внутри оператора имеют приоритет над флагами optimizer_switch.
[...]
BNL, NO_BNL: включить или отключить BNL для указанных таблиц.
Вы можете использовать, например,
SELECT /*+ NO_BNL() */ t1.* FROM t1 INNER JOIN t2 INNER JOIN t3;