oracle - Oracle 19c & 12c 创建索引并行提示
问题描述
创建索引时,PARALLEL
提示的行为似乎在 19c 和 12c 中都没有按预期运行。
在所有 19c 案例中,提示都是Unused
,但在其中两个案例中,注释实际上说automatic DOP
已使用,并且在这些案例中,它实际上是并行处理的。
Hint DOP NOTE
------------------------- --- ---------------------------------------------------------------------------
/*+ PARALLEL (16) */ 1
/*+ PARALLEL (4) */ 1
/*+ PARALLEL */ 16 automatic DOP: Computed Degree of Parallelism is 16 because of degree limit
/*+ PARALLEL (AUTO) */ 16 automatic DOP: Computed Degree of Parallelism is 16 because of degree limit
/*+ PARALLEL (DEFAULT) */ 1
/*+ PARALLEL (MANUAL) */ 1
来自 Oracle 19c VLDB 和分区指南 - 控制自动并行度:
"MANUAL 此设置禁用 Auto DOP,...对于 PARALLEL_DEGREE_POLICY 的默认设置 MANUAL,系统仅在已在对象上显式设置 DOP 或在 SQL 语句中指定并行提示时使用并行执行。DOP使用的正是指定的。”
未在为其创建此索引的表上显式设置 DOP。
使用具有以下初始化参数的 Oracle 19c。
set serveroutput on;
show parameters parallel;
---------------------------------------------------
awr_pdb_max_parallel_slaves integer 10
containers_parallel_degree integer 65535
fast_start_parallel_rollback string LOW
max_datapump_parallel_per_job string 50
optimizer_ignore_parallel_hints boolean FALSE
parallel_adaptive_multi_user boolean FALSE
parallel_degree_limit string CPU
parallel_degree_policy string MANUAL
parallel_execution_message_size integer 16384
parallel_force_local boolean FALSE
parallel_instance_group string
parallel_max_servers integer 320
parallel_min_degree string 1
parallel_min_percent integer 0
parallel_min_servers integer 32
parallel_min_time_threshold string AUTO
parallel_servers_target integer 128
parallel_threads_per_cpu integer 2
recovery_parallelism integer 0
...
show parameters cpu_count;
show parameters parallel_threads_per_cpu;
---------------------------------------------------
cpu_count integer 8
parallel_threads_per_cpu integer 2
该索引具有以下形式:
CREATE /*+ [PARALLEL HINT] */ INDEX OWN.IX ON
OWN.T (some_char, some_number, some_date1, some_date2)
LOCAL NOLOGGING TABLESPACE INDX COMPRESS
我的会话是唯一的活动会话,结果是可重复的,表明系统负载不是一个因素。如果需要,我已经解释了计划,但是这篇文章已经足够长了。
我在 Oracle 12c 中尝试了类似的任务(但索引不是本地的,并且基础表没有分区)具有以下结果和初始化参数。
Hint DOP Note
------------------------- ----- --------------------------------------------------------------------------------
/*+ PARALLEL (16) */ 16/32 Degree of Parallelism is 16 because of hint
/*+ PARALLEL (4) */ 4/8 Degree of Parallelism is 4 because of hint
/*+ PARALLEL */ 2/4 automatic DOP: Computed Degree of Parallelism is 2
/*+ PARALLEL (AUTO) */ 1 automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold
/*+ PARALLEL (DEFAULT) */ 1
/*+ PARALLEL (MANUAL) */ 1
使用具有以下初始化参数的 Oracle 12c。
show parameters parallel;
------------------------------------------------------
fast_start_parallel_rollback string LOW
parallel_adaptive_multi_user boolean TRUE
parallel_automatic_tuning boolean FALSE
parallel_degree_level integer 100
parallel_degree_limit string CPU
parallel_degree_policy string MANUAL
parallel_execution_message_size integer 16384
parallel_force_local boolean FALSE
parallel_instance_group string
parallel_io_cap_enabled boolean FALSE
parallel_max_servers integer 320
parallel_min_percent integer 0
parallel_min_servers integer 32
parallel_min_time_threshold string AUTO
parallel_server boolean FALSE
parallel_server_instances integer 1
parallel_servers_target integer 128
parallel_threads_per_cpu integer 2
recovery_parallelism integer 0
...
show parameters cpu_count;
show parameters parallel_threads_per_cpu;
------------------------------------------------------
cpu_count integer 8
parallel_threads_per_cpu integer 2
在 19c 中:
为什么 DOP 1 用于上面列出的带有 、 和 case 的
/*+ PARALLEL (16) */
并行/*+ PARALLEL (4) */
提示/*+ PARALLEL (DEFAULT) */
?预计分别为 16、4 和 16 (=8*2)。对于 DOP 为 16 的两种情况,为什么解释计划说提示是
Unused
auto DOP 确实计算了 DOP > 1?
在 12c
- 为什么 DOP 1 用于并行提示
/*+ PARALLEL (DEFAULT) */
?预计 16 (=8*2)。
19c 与 12c
- 为什么 19c 不会像 12c 那样产生两倍于并行执行服务器的 DOP?(在 12c 中,当 auto DOP 为 4 时,我们得到 8 个并行执行服务器,当 DOP 为 16 时,我们得到 32,...,但这在 19c 中不会发生。)
解决方案
在 Oracle 12c 中引入了并行 dml 的提示ENABLE_PARALLEL_DML,
您可以直接在 dml sql 语句中使用它。
/*+ 并行(16) enable_parallel_dml */
推荐阅读
- owl - 如何比较 Protege 中的两个数据属性?
- c++ - 在带有可能使地址无效的参数的 c++ 数组上调用 operator[]?
- azure - 逻辑应用发布到 Microsoft Teams 数据未显示在字段中
- node.js - 运行 Node.js 项目的惯用方式是什么
- jsp - 在html中使用变量的值作为变量
- awk - 连接两个具有共同模式但具有多个 lign 的文件
- python - 使用某些程序时,pynput 无法监听键盘输入
- windows - 如何更好地处理 CommandBar 中的长项目名称
- python - 如果在循环期间发生异常:如何在传递异常之前返回中间结果?
- android - Android 库模块中的房间数据库设置