我们如何在 Oracle Merge 语句中使用 use parallel (10) 提示
Posted
技术标签:
【中文标题】我们如何在 Oracle Merge 语句中使用 use parallel (10) 提示【英文标题】:How can we use use parallel (10) hint in Oracle Merge statement 【发布时间】:2021-07-26 03:20:20 【问题描述】:我们如何在 oracle 合并语句中使用并行 (10) 提示? ,我对提示有点陌生,想知道这是否可以用于合并语句?
【问题讨论】:
【参考方案1】:非常非常简短:
首先,必须在服务器上启用并行执行。 您需要检查以下3个参数:
select name,value
from v$parameter
where name in (
'parallel_degree_policy'
,'parallel_servers_target'
,'parallel_max_servers'
);
PARALLEL_MAX_SERVERS指定最大并行执行进程数,所以必须>0
PARALLEL_SERVERS_TARGET 指定在使用语句队列之前允许运行并行语句的并行服务器进程数。当参数 PARALLEL_DEGREE_POLICY 设置为 AUTO 时,如果必要的并行服务器进程不可用,Oracle 将对需要并行执行的 SQL 语句进行排队。
PARALLEL_DEGREE_POLICY 指定是否启用自动并行度、语句队列和内存中并行执行。
价值观:
MANUAL:禁用自动并行度、语句队列和内存中并行执行。这会将并行执行的行为恢复到 Oracle 数据库 11g 第 2 版 (11.2) 之前的行为。这是默认设置。
LIMITED:为某些语句启用自动并行度,但禁用语句队列和内存中并行执行。自动并行度仅适用于那些访问使用 PARALLEL 子句显式修饰的表或索引的语句。具有指定并行度的表和索引将使用该并行度。
AUTO:启用自动程度的并行度、语句队列和内存中并行执行。
然后你可以检查你的会话参数:
select id,name,sql_feature,isdefault,value
from v$ses_optimizer_env e
where name like '%parallel%'
and sid=userenv('sid');
ID NAME SQL_FEATURE ISDEFAUL VALUE
---------- ---------------------------------------- ------------ -------- -------------------------
2 parallel_execution_enabled QKSFM_CBO YES true
13 parallel_threads_per_cpu QKSFM_CBO YES 2
35 parallel_query_mode QKSFM_ALL YES enabled
36 parallel_dml_mode QKSFM_ALL YES disabled
37 parallel_ddl_mode QKSFM_ALL YES enabled
245 parallel_degree_policy QKSFM_PQ YES manual
246 parallel_degree QKSFM_PQ YES 0
247 parallel_min_time_threshold QKSFM_PQ YES 10
256 parallel_query_default_dop QKSFM_PQ YES 0
272 parallel_degree_limit QKSFM_PQ YES 65535
273 parallel_force_local QKSFM_PQ YES false
274 parallel_max_degree QKSFM_PQ YES 16
289 parallel_autodop QKSFM_PQ YES 0
290 parallel_ddldml QKSFM_PQ YES 0
331 parallel_dblink QKSFM_PQ YES 0
在这里你可以注意到三个xxx_mode参数:parallel_ddl_mode
、parallel_dml_mode
和parallel_query_mode
,它们允许在会话级别进行相关的并行操作,可以使用alter session enable/disable/force
启用或禁用,例如alter session force parallel dml parallel 16
- 启用并行DOP=16 的 dml:
SQL> alter session force parallel dml parallel 16;
Session altered.
SQL> select id,name,sql_feature,isdefault,value
2 from v$ses_optimizer_env e
3 where name like 'parallel_dml%'
4 and sid=userenv('sid');
ID NAME SQL_FEATURE ISDEFAULT VALUE
---------- ------------------------- ----------- ---------- -------------------------
4 parallel_dml_forced_dop QKSFM_CBO NO 16
36 parallel_dml_mode QKSFM_ALL NO forced
提示parallel
有2 forms:
parallel(DoP)
和对象级别parallel(alias DoP)
其实这个提示
-
在
parallel_degree_policy
参数=MANUAL
的情况下启用并行执行
降低并行操作的成本,使并行计划更可取(它不会强制并行执行 - 如果成本比并行计划便宜,您的计划仍将是串行的),并且
指定 DoP(并行度)。
接下来,不同的计划步骤可以有不同的 DOP,甚至可以串行运行:例如,不同的对象(索引或表或其分区)可以有不同的parallel
选项(alter table xxx parallel 8
)或“读取”操作(行-sources) 可以并行化,但“更改”(如 UPDATE
或 MERGE
)操作是串行的。
例如,使用 parallel_degree_policy=manual 并禁用并行 dml:
SQL> explain plan for update/*+ parallel(4) */ t set b=a+1 where a >1;
Plan hash value: 1378397380
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 9999 | 79992 | 2 (0)| 00:00:01 | | | |
| 1 | UPDATE | T | | | | | | | |
| 2 | PX COORDINATOR | | | | | | | | |
| 3 | PX SEND QC (RANDOM)| :TQ10000 | 9999 | 79992 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 4 | PX BLOCK ITERATOR | | 9999 | 79992 | 2 (0)| 00:00:01 | Q1,00 | PCWC | |
|* 5 | TABLE ACCESS FULL| T | 9999 | 79992 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
---------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - filter("A">1)
Note
-----
- Degree of Parallelism is 4 because of hint
您可以看到 FTS(全表扫描)是并行的,但 UPDATE
是串行的。在实际支持的较新的 Oracle 版本上,您可以看到更多注释 - PDML is disabled in current session
。
如果您使用 alter session enable parallel dml
或 alter session force parallel dml parallel N
启用并行 dml(在实际的 oracle 版本上,您还可以使用 enable_parallel_dml
提示,它已向后移植到 11.2.0.4,但仅在 12.1 之后才记录,所以我不会建议至少在 12.1 之前使用它):
SQL> alter session enable parallel dml;
Session altered.
SQL> explain plan for update/*+ parallel(4) */ t set b=a+1 where a >1;
Plan hash value: 2037160838
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 9999 | 79992 | 2 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 9999 | 79992 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 3 | UPDATE | T | | | | | Q1,00 | PCWP | |
| 4 | PX BLOCK ITERATOR | | 9999 | 79992 | 2 (0)| 00:00:01 | Q1,00 | PCWC | |
|* 5 | TABLE ACCESS FULL| T | 9999 | 79992 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
---------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - filter("A">1)
Note
-----
- Degree of Parallelism is 4 because of hint
如您所见,现在UPDATE
也是并行的。
因此,这取决于您当前的数据库、表和会话参数以及您想要获取的确切内容,以及:在parallel_degree_policy=manual
的情况下启用并行操作,或启用并行 dml,或限制/强制所需的 DOP 等
关于开始的更多细节:
19.1.2.7 Hints for Parallel Execution
Using Parallel Execution
How Parallel Execution Works
【讨论】:
我尝试在合并语句上使用并行提示,但仍然在第 3 行收到以下错误错误:ORA-01652:无法在表空间 TEMP 中将临时段扩展 64 ------ --------------> 但是我们有超过 700 GB 的空间。我们正在尝试从源中获取 22,511,505 条记录并将它们更新到其中包含 1116789963 行数据的目标表中。这是一个一次性的过程。 @karthik 显示您的真实执行计划和 RTSM 报告 @karthik 这与您的问题不同【参考方案2】:怎么样?像这样:
SQL> alter session enable parallel dml;
Session altered.
SQL> merge /*+ parallel(10) */ into emp e
2 using dept d
3 on (d.deptno = e.deptno)
4 when matched then update set
5 e.comm = e.comm * 1;
14 rows merged.
SQL>
PARALLEL
提示将启用读并行,但要同时启用写并行,您需要运行上述 ALTER SESSION
命令或使用提示 /*+ ENABLE_PARALLEL_DML */
。
【讨论】:
我们是否必须运行alter session enable parallel dml;在使用并行提示运行合并之前? 显然,正如文档 (docs.oracle.com/database/121/VLDBG/…) 所说。 “只有在会话或 SQL 语句中显式启用并行 DML 时,才能并行化 DML 语句。要在会话中启用此模式,请运行 ...”。是的,MERGE 是一个 DML。以上是关于我们如何在 Oracle Merge 语句中使用 use parallel (10) 提示的主要内容,如果未能解决你的问题,请参考以下文章