План, который у вас там, вообще не дает много информации.
Используйте SQL * Plus и используйте dbms_xplan, чтобы получить более подробный план. Ищите скрипт с именем utlxpls.sql.
Это дает немного больше информации: -
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1837 | 23881 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| BAR | 18 | 468 | 2 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| FOO | 1837 | 23881 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("BAR"."A"=:B1)
Note
-----
- dynamic sampling used for this statement
18 rows selected.
Я не создавал индексы или внешние ключи и не собирал статистику по таблицам, что могло бы изменить план и выбранный механизм соединения. Oracle на самом деле выполняет соединение типа NESTED LOOPS. Шаг 1, ваш вложенный выбор, выполняется для каждой строки, возвращаемой из FOO.
Этот способ выполнения SELECT не быстрее. Это может быть то же самое или медленнее. В общем, попробуйте объединить все в главном предложении WHERE, если оно не станет ужасно нечитаемым.