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... При значении по умолчанию 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

В 19 в.:

  1. Почему DOP 1 для параллельных подсказок с /*+ PARALLEL (16) */, /*+ PARALLEL (4) */ и /*+ PARALLEL (DEFAULT) */ случаями, перечисленными выше? Ожидается 16, 4 и 16 (=8*2) соответственно.

  2. Для двух случаев, когда DOP был равен 16, почему план объяснения говорит, что подсказка была Unused, когда автоматический DOP вычислял DOP > 1?

В 12c

  1. Почему DOP 1 для параллельных подсказок с /*+ PARALLEL (DEFAULT) */? Ожидается 16 (=8*2).

19c против 12c

  1. Почему 19c не производит двойной DOP серверов с параллельным выполнением, как это делается в 12c? (В 12c, когда auto DOP равен 4, мы получаем 8 серверов параллельного выполнения, когда DOP равен 16, мы получаем 32, ..., но этого не происходит в 19c.)

person Alex Bartsmon    schedule 19.12.2020    source источник
comment
Ну, согласно документации (например, здесь ) операторы DDL не принимают подсказки. Для создания индекса используйте предложение parallel, чтобы указать DOP. Попробуйте это и расскажите нам, что у вас получилось.   -  person gsalem    schedule 19.12.2020


Ответы (1)


В Oracle 12c появилась подсказка для параллельного dml, ENABLE_PARALLEL_DML ,
которую можно использовать непосредственно внутри инструкции dml sql.

/*+ параллель(16) enable_parallel_dml */

person Figaro2K    schedule 15.03.2021