2

我不知道在 oracle 执行架构方面是否可能,所以我只是想问一下。
我有一个存储一些模式名称(例如 sch1、sch2、sch3 )的表,并且我正在使用该表在游标内动态创建一个联合所有查询。
所以例如。我的查询如下所示:

select col1, col2 from sch1.tab1
union all 
select col1, col2 from sch2.tab1
union all 
select col1, col2 from sch3.tab1

例如。如果我选择一个具有并行提示的表,例如

select /*+ parallel(tab,4)*/ * from tab

如果我没记错的话,它将打开 4 个会话并在一次执行中处理它。
那么可以用这种方法查询所有表吗?

4

1 回答 1

2

您正在搜索Union All 的并发执行

像 UNION 或 UNION ALL 这样的集合运算符由组合到单个 SQL 语句的多个查询(分支)组成。传统上,集合运算符是按顺序处理的。单个分支可以串行或并行处理,但一次只能处理一个分支,一个接一个分支。虽然这种方法可以满足许多用例,但在某些情况下,应该同时处理 UNION 或 UNION ALL 语句的多个分支。最典型的情况是当几个或所有分支都是远程 SQL 语句时。在这种情况下,希望在所有参与的远程系统上进行并发处理,以加快整体处理时间,而不会增加任何参与系统的工作量。

当 OPTIMIZER_FEATURES_ENABLE 初始化参数设置为小于 12.1 的值时,必须使用 PQ_CONCURRENT_UNION 提示显式启用 UNION 或 UNION ALL 语句的并发执行。

SELECT /*+ PQ_CONCURRENT_UNION(@"SET$1") */ * 
FROM (
  select col1, col2 from sch1.tab1
  union all 
  select col1, col2 from sch2.tab1
  union all 
  select col1, col2 from sch3.tab1
) a;

OPTIMIZER_FEATURE_ENABLED如果您是 12.1+ 并且至少一个分支被认为是并行处理的,则您无需执行任何操作。

于 2018-09-23T10:00:21.047 回答