为什么在使用 parallel 子句时我看不到并行执行的任何好处?

Laz*_*zer 2 oracle oracle-11g-r2 parallelism

我有这两种创建表格和填充行的方法。第一个使用并行(3 级)子句,所以我预计插入速度会快得多。但我对 a) 和 b) 所用的时间进行了计时,结果几乎相同。没有迹象表明方法 a) 更快,实际上在某些运行中,方法 b) 更快。

我认为 parallel 子句会并行执行插入,因此速度要快得多。我在这里缺少什么?

一种)

create table TAB1
(col0 number not null,
 col1 number,
 col2 number,
 col3 varchar2(25)) parallel (degree 3)
 storage (initial 100K next 100K pctincrease 0);


begin
 for i in 1..300000 loop
  insert into TAB1 values(i-1,i,300000-i,null);
 end loop;
 commit;
end;
/
Run Code Online (Sandbox Code Playgroud)

b)

create table TAB2
(col0 number not null,
 col1 number,
 col2 number,
 col3 varchar2(25))
 storage (initial 100K next 100K pctincrease 0);


begin
 for i in 1..300000 loop
  insert into TAB2 values(i-1,i,300000-i,null);
 end loop;
 commit;
end;
/
Run Code Online (Sandbox Code Playgroud)

Vin*_*rat 7

您没有看到并行执行的好处,因为两种插入方法都使用单行插入,因此并行不会启动!

并行执行仅适用于批量操作。许多微小的操作不符合集合操作的条件。您在这里逐行插入行,您应该尝试使用批量操作 ( INSERT /*+APPEND*/ INTO SELECT, CREATE TABLE AS SELECT...) 并查看是否可以实现一些性能改进。

您可以判断 Oracle 何时执行并行执行,因为解释计划将显示并行操作。

进一步阅读: