Я не думаю, что в Oracle для вашего особого случая используется только одно WHEN
предложение вставки и реализован путь оптимизатора с использованием индекса (тест также показывает всегда FULL TABLE SCAN
с).
Причина в том, что в общем случае развертывается больше предложений вставки , таких как:
insert all
when id < 3 then into tb002 values(id)
when id >= 3 then into tb003 values(id)
select id from tb001;
Что делает Oracle, видно в плане исключений
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 10 | 130 | 3 (0)| 00:00:01 |
| 1 | MULTI-TABLE INSERT | | | | | |
| 2 | TABLE ACCESS FULL | TB001 | 10 | 130 | 3 (0)| 00:00:01 |
| 3 | INTO | TB002 | | | | |
| 4 | INTO | TB003 | | | | |
-----------------------------------------------------------------------------
Вы видите FULL SCAN
исходной таблицы в строке 2, то есть все строки считаются;для каждой строки все INTO
вставные предложения оцениваются, и если ИСТИНА вставляется, то строка.
Если вы хотите реализовать предложение ELSE
- вы должны использовать INSERT FIRST
insert first
when id < 3 then into tb002 values(id)
else into tb003 values(id)
select id from tb001
из документации Oracle
Если вы укажете FIRST, тогда база данных оценивает каждое предложение WHEN в том порядке, в которомэто появляется в заявлении. Для первого предложения WHEN, которое оценивается как true, база данных выполняет соответствующее предложение INTO и пропускает последующие предложения WHEN для данной строки.