4

我有一个这样的 Oralce 查询:

Sub_query1
Union
Sub_query2;

我想并行化查询。我在网上搜索,发现有人说 UNION 不能并行化,因为子查询是串行运行的,而 UNION 直到两个子查询完成后才会运行。他们是人们说 UNION 可以并行化的。我的问题是:

         (1) can a UNION query be parallezied? if yes, how? if no, why?
         (2) can I just parallelize the two sub queries?

我正在使用 Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production

谢谢!

4

3 回答 3

3

我认为您对同时运行两个查询与并行运行查询感到困惑。SQL 是一种描述性语言,它被 SQL 引擎/优化器翻译成代码。此查询计划由许多不同的组件组成,用于从表中检索数据、执行连接、执行聚合等。

Oracle 为您的联合查询生成查询计划。查询计划的每个组件都可以使用所有可用的处理器(假设满足正确的条件)。但是,每个组件基本上一次运行一个(合理的近似值)。因此,查询的组件是并行化的,尽管两个子查询不会同时运行。

一条忠告。每当您考虑使用 aUNION时,您应该问问自己 aUNION ALL是否也可以工作。UNION ALL效率更高,因为它不必删除最终结果集上的重复项。

于 2012-10-17T18:13:20.043 回答
2

是的,正如您已经发现的那样,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 行,在查询的后半部分运行。 并行 UNION 查询的活动报告

于 2012-12-30T05:20:17.130 回答
1

通过一些测试和比较执行计划,我终于找到了一种并行化联合的方法,如下所示:

select/* +parallel (Result) */ * from
(Sub_query1
Union
Sub_query2) Result;

通过这样做,时间和 CPU 成本几乎是串行版本的一半。向两个子查询添加并行提示不会改变时间和 CPU 成本。

于 2012-10-17T19:23:13.033 回答