为子查询返回的每一行测试每个 When 条件?

Each When condition is tested for each row returned by the subquery?

所以我将自动跟踪设置为
ramin.tb001 有 10 行。

在 1 个版本中我使用相等,在第二个版本中小于
我想知道的是当条件从 ramin.tb001 读取 10 行并检查条件或如何?

I want to know is the When condions reads 10 rows from ramin.tb001 and check condition or how?

您的第一个插入语句应用条件 when id = 6,第二个应用条件 when id < 10。在这两种情况下,查询都会读取整个 table 并通过评估每一行来过滤结果集。还可以如何处理查询?

好吧,如果 ramin.tb001.id 上有唯一索引,优化器可能会选择使用它。由于每次只选择ID,所以整个查询都可以从索引中满足,比扫描table效率更高。即使 ramin.tb001 只有一列也是如此,因为 ID 会在索引中排序,但可能不会在 table 中排序。尽管考虑到源数据具有如此微不足道的数据量,但实际性能的差异可以忽略不计。

我不认为 Oracle 只用一个 WHEN insert 子句 来解释你的特殊情况,并使用索引实现了优化器路径(测试也总是显示 FULL TABLE SCANs).

原因是一般情况下部署较多插入子句如下:

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 |       |       |            |          |
-----------------------------------------------------------------------------

您在第 2 行中看到来源 table 的 FULL SCAN,即所有行都被考虑在内;对于每一行,所有 INTO 插入子句 都被评估,如果为真,则插入该行。

如果您想实施 ELSE 子句 - 您必须使用 INSERT FIRST

insert first
when id < 3 then into tb002 values(id)
else into tb003 values(id)
select id from tb001

来自 Oracle documentation

If you specify FIRST, then the database evaluates each WHEN clause in the order in which it appears in the statement. For the first WHEN clause that evaluates to true, the database executes the corresponding INTO clause and skips subsequent WHEN clauses for the given row.