【问题标题】:Oracle 19c & 12c Create Index Parallel HintOracle 19c & 12c 创建索引并行提示
【发布时间】:2020-12-19 02:54:06
【问题描述】:

在创建索引时,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,...默认设置为 MANUAL 为 PARALLEL_DEGREE_POLICY,系统只使用并行 在对象上显式设置 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 中:

  1. 为什么 DOP 1 用于上面列出的 /*+ PARALLEL (16) *//*+ PARALLEL (4) *//*+ PARALLEL (DEFAULT) */ 案例的并行提示?预计分别为 16、4 和 16 (=8*2)。

  2. 对于 DOP 为 16 的两种情况,为什么当自动 DOP 确实计算出 DOP > 1 时,解释计划说提示是 Unused

在 12c 中

  1. 为什么 DOP 1 用于 /*+ PARALLEL (DEFAULT) */ 的并行提示?预计 16 (=8*2)。

19c 与 12c

  1. 为什么 19c 不能像 12c 那样产生两倍于并行执行服务器的 DOP? (在 12c 中,当 auto DOP 为 4 时,我们得到 8 个并行执行服务器,当 DOP 为 16 时,我们得到 32,...,但这在 19c 中不会发生。)

【问题讨论】:

  • 好吧,根据文档(例如 here ),DDL 语句没有提示。对于创建索引,使用并行子句来指定 DOP。试试看,告诉我们你得到了什么。

标签: oracle parallel-processing oracle12c hint oracle19c


【解决方案1】:

在 Oracle 12c 中引入了并行 dml 的提示,ENABLE_PARALLEL_DML
可以直接在 dml sql 语句中使用。

/*+ 并行(16) enable_parallel_dml */

【讨论】:

    猜你喜欢
    • 2017-09-25
    • 2021-06-12
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2023-01-27
    • 1970-01-01
    相关资源
    最近更新 更多