Oracle中用于INSERT的多表联合SELECT语句的Parallel hint使用方法
在带UNION的INSERT...SELECT中使用Parallel Hint的正确方式
针对你的场景,有几种正确添加Parallel hint的方式,具体如下:
1. 给整个INSERT操作添加全局并行Hint(推荐)
把/*+ PARALLEL */和已有的APPEND hint放在一起,加在INSERT INTO之后,这样整个INSERT写入和SELECT查询(包括UNION的所有分支)都会启用并行处理,是最省心高效的方式。
示例代码:
INSERT INTO /*+ APPEND PARALLEL */ ITEM ( a -- 补全实际列名 ) SELECT a FROM GTT_LINE p, GTT_LINE_XY r WHERE <condition> UNION SELECT a FROM GTT_LINE p, GTT_LINE_XY r WHERE <condition>
如果需要指定具体并行度,比如4,可以写成/*+ APPEND PARALLEL(4) */。
2. 给每个SELECT分支单独添加并行Hint
如果需要对UNION的不同分支单独控制并行度,可以在每个SELECT语句前添加PARALLEL hint,但要注意UNION的去重合并阶段可能还是串行,整体性能不如全局Hint。
示例代码:
INSERT INTO /*+ APPEND */ ITEM ( a -- 补全实际列名 ) SELECT /*+ PARALLEL */ a FROM GTT_LINE p, GTT_LINE_XY r WHERE <condition> UNION SELECT /*+ PARALLEL(3) */ a FROM GTT_LINE p, GTT_LINE_XY r WHERE <condition>
关键注意事项
- 临时表的并行支持:你用到的
GTT_LINE和GTT_LINE_XY是全局临时表,要确保数据库版本支持临时表的并行访问(Oracle 12c及以上通常没问题),旧版本可能需要额外配置。 - UNION vs UNION ALL:如果业务上不需要去重,建议把
UNION换成UNION ALL,避免排序合并的开销,并行性能提升会更明显。 - 权限要求:执行并行操作需要用户拥有
PARALLEL_EXECUTE权限或相关角色(比如DBA)。 - Hint有效性:数据库可能会忽略Hint,如果执行计划没走并行,要检查表的并行度设置、系统资源是否充足等。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

