Sql 并行化oracle联合查询问题

Sql 并行化oracle联合查询问题,sql,oracle,oracle11gr1,Sql,Oracle,Oracle11gr1,我有这样一个Oralce查询: Sub_query1 Union Sub_query2; select/* +parallel (Result) */ * from (Sub_query1 Union Sub_query2) Result; 我想并行化查询。我在网上搜索,发现一些人说UNION不能并行化,因为子查询是串行运行的,并且UNION在两个子查询完成之前不会运行。他们说,工会可以并行化。 我的问题是: 我正在使用Oracle Database 11g Enterprise Editi

我有这样一个Oralce查询:

Sub_query1
Union
Sub_query2;
select/* +parallel (Result) */ * from
(Sub_query1
Union
Sub_query2) Result;
我想并行化查询。我在网上搜索,发现一些人说UNION不能并行化,因为子查询是串行运行的,并且UNION在两个子查询完成之前不会运行。他们说,工会可以并行化。 我的问题是:

我正在使用Oracle Database 11g Enterprise Edition 11.1.0.7.0版-64位产品


谢谢大家!

我认为您混淆了同时运行两个查询与并行运行查询。SQL是一种描述性语言,由SQL引擎/优化器将其转换为代码。此查询计划由许多不同的组件组成,用于从表中检索数据、执行连接、执行聚合等

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


一条建议。每当您考虑使用
联合
,您都应该问问自己
联合所有
是否也能工作。
UNION ALL
效率更高,因为它不必删除最终结果集上的重复项。

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

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

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

是的,正如您已经发现的,联合查询可以并行运行

要完全理解这里发生的事情,您可能需要阅读

操作内并行几乎可以发生在任何地方。操作间并行只发生在生产者和消费者之间。在这种情况下,这意味着联合(消费者)可以在整个时间内并行执行。每个子查询(生产者)将并行执行,但不会同时执行

通过查看查询的活动报告,您可以在下面的示例中看到这种情况

--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;
——创建两个简单的表
创建表test1(一个数字);
创建表test2(一个数字);
--用1000万行填充它们
开始
因为我在1。。100圈

插入test1从dual connect逐层选择级别感谢ruakh,我添加了Oracle版本。很可能这个问题更适合dba.stackoverflow.com:你能证明sub_query1和sub_query2是并行运行的吗,因为据我所知,这将并行并集执行sub_query1,即sub_query2并行执行的结果。我无法从执行计划中证明这两个子查询是并行执行还是串行执行。