是的,正如您已经发现的那样,UNION 查询可以并行运行。
要完全了解这里发生了什么,您可能需要阅读VLDB 和分区指南中的并行执行。
操作内并行性几乎可以在任何地方发生。互操作并行只发生在生产者和消费者之间。在这种情况下,这意味着 UNION(消费者)可以在整个时间内并行执行。每个子查询(生产者)将并行执行,但不会彼此同时执行。
通过查看查询的活动报告,您可以在下面的示例中看到这种情况。
--Create two simple tables
create table test1(a number);
create table test2(a number);
--Populate them with 10 million rows
begin
for i in 1 .. 100 loop
insert into test1 select level from dual connect by level <= 100000;
insert into test2 select level from dual connect by level <= 100000;
end loop;
end;
/
commit;
--Gather stats
begin
dbms_stats.gather_table_stats(user, 'TEST1');
dbms_stats.gather_table_stats(user, 'TEST2');
end;
/
--Run a simple UNION.
select /*+ parallel */ count(*) from
(
select a from test1 join test2 using (a) where a <= 1000
union
select a from test2 join test1 using (a) where a <= 1000
);
--Find the SQL_ID by looking at v$sql, then get the active report
--(which must be saved and viewed in a browser)
select dbms_sqltune.report_sql_monitor(sql_id => 'bv5c18gyykntv', type => 'active')
from dual;
这是输出的一部分。它很难阅读,但它显示了计划的前 11 个步骤 UNION 如何始终运行。第一个子查询,接下来的 9 行,在查询的前半部分运行。然后第二个子查询,最后 9 行,在查询的后半部分运行。