При создании индекса поведение подсказки 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 в.:
Почему DOP 1 для параллельных подсказок с
/*+ PARALLEL (16) */
,/*+ PARALLEL (4) */
и/*+ PARALLEL (DEFAULT) */
случаями, перечисленными выше? Ожидается 16, 4 и 16 (=8*2) соответственно.Для двух случаев, когда DOP был равен 16, почему план объяснения говорит, что подсказка была
Unused
, когда автоматический DOP вычислял DOP > 1?
В 12c
- Почему DOP 1 для параллельных подсказок с
/*+ PARALLEL (DEFAULT) */
? Ожидается 16 (=8*2).
19c против 12c
- Почему 19c не производит двойной DOP серверов с параллельным выполнением, как это делается в 12c? (В 12c, когда auto DOP равен 4, мы получаем 8 серверов параллельного выполнения, когда DOP равен 16, мы получаем 32, ..., но этого не происходит в 19c.)