Каждое условие Когда проверяется для каждой строки, возвращаемой подзапросом? - PullRequest
0 голосов
/ 30 октября 2019

Поэтому я установил автоматическую трассировку на
У ramin.tb001 было 10 строк.

enter image description here

enter image description here

В 1 версии я использую равенство ив секунду меньше чем
Я хочу знать, когда условия читают 10 строк из ramin.tb001 и проверяют условие или как?

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Я не думаю, что в 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 для данной строки.

0 голосов
/ 30 октября 2019

Я хочу знать, когда условия читают 10 строк из ramin.tb001 и проверяют условие или как?

Ваш первый оператор вставки применяет условие when id = 6, а второй -условие when id < 10. В обоих случаях запрос читает всю таблицу и фильтрует результирующий набор, оценивая каждую строку. Как еще запрос может быть обработан?

Что ж, если бы в * 1009 был уникальный индекс, оптимизатор, вероятно, решил бы использовать его вместо этого. Поскольку в каждом случае выбирается только ID, весь запрос может быть выполнен из индекса, что будет более эффективным, чем сканирование таблицы. Это верно, даже если ramin.tb001 имеет только один столбец, потому что ID будет отсортирован в индексе, но, возможно, не в таблице. Несмотря на то, что исходные данные содержат такой тривиальный объем данных, разница в фактической производительности будет незначительной.

...