PARALLEL オプティマイザヒントは、並列スキャンを強制実行するために使用されます。

NO_PARALLEL オプティマイザヒントは、並列スキャンの使用を防止します。

概要

PARALLEL (table [ parallel_degree | DEFAULT ])

NO_PARALLEL (table)

説明

並列スキャンにより、複数のバックグラウンドワーカーが指定されたクエリのテーブルを同時にスキャンできます。 順次スキャンなどの他の方法と比較すると、このスキャンではパフォーマンスが向上します。

パラメーター

パラメーター 説明
table 並列ヒントが使用されるテーブルです。
parallel_degree | DEFAULT parallel_degree パラメーターの値は、並列スキャンで使用するワーカーの必要数を指定する正の整数です。 このパラメーターが設定されている場合、このパラメーターと構成パラメーター max_parallel_workers_per_gather の間の小さい方の値が、ワーカーの計画数として使用されます。 max_parallel_workers_per_gather パラメーターの詳細については、https://www.postgresql.org/docs/11/runtime-config-resource.htmlをご参照ください。

DEFAULT が設定されている場合、可能な最大並列度が使用されます。

parallel_degree と DEFAULT の両方が省略されている場合、クエリオプティマイザーが並列度を決定します。 この場合、table パラメーターが parallel_workers ストレージパラメーターで設定されている場合、parallel_workers の値が並列度として使用されます。 それ以外の場合、オプティマイザーは、DEFAULT で指定された可能な最大並列度を使用します。 parallel_workers ストレージパラメーターの詳細については、https://www.postgresql.org/docs/11/sql-createtable.htmlをご参照ください。

状況に関係なく、並列度は max_parallel_workers_per_gather の値を超えることはありません。

以下の設定パラメーター設定が有効です。

SHOW max_worker_processes;

 max_worker_processes
----------------------
 8
(1 row)

SHOW max_parallel_workers_per_gather;

 max_parallel_workers_per_gather
---------------------------------
 2
(1 row)

次の例は、pgbench_accounts テーブルのデフォルトスキャンを示しています。 順次スキャンがクエリプランに表示されます。

SET trace_hints TO on;

EXPLAIN SELECT * FROM pgbench_accounts;

                                QUERY PLAN
---------------------------------------------------------------------------
 Seq Scan on pgbench_accounts  (cost=0.00..53746.15 rows=2014215 width=97)
(1 row)

次の例では、PARALLEL ヒントを使用しています。 クエリプランで、バックグラウンドワーカーを起動する Gather ノードは、2 つのワーカーの使用が計画されていることを指定しています。

trace_hints が on に設定されている場合、INFO: [HINTS] 行が表示され、pgbench_accounts およびその他のヒントによって PARALLEL がサポートされていることが示されます。 残りの例では、これらの行は表示されません。 これらの例は、trace_hints が off にリセットされている同じ出力を示しています。
EXPLAIN SELECT /*+ PARALLEL(pgbench_accounts) */ * FROM pgbench_accounts;

INFO:  [HINTS] SeqScan of [pgbench_accounts] rejected due to PARALLEL hint.
INFO:  [HINTS] PARALLEL on [pgbench_accounts] accepted.
INFO:  [HINTS] Index Scan of [pgbench_accounts].[pgbench_accounts_pkey] rejected due to PARALLEL hint.
                                       QUERY PLAN
-----------------------------------------------------------------------------------------
 Gather  (cost=1000.00..244418.06 rows=2014215 width=97)
   Workers Planned: 2
   ->  Parallel Seq Scan on pgbench_accounts  (cost=0.00..41996.56 rows=839256 width=97)
(3 rows)

次の例は、max_parallel_workers_per_gather の増加した値を示しています。

SET max_parallel_workers_per_gather TO 6;

SHOW max_parallel_workers_per_gather;

 max_parallel_workers_per_gather
---------------------------------
 6
(1 row)

pgbench_accounts に対する同じクエリが、PARALLEL ヒントで並列度指定なしで再び使用されます。 ワーカーの計画数はオプティマイザによって決定され、4 に増加しました。

EXPLAIN SELECT /*+ PARALLEL(pgbench_accounts) */ * FROM pgbench_accounts;

                                       QUERY PLAN
-----------------------------------------------------------------------------------------
 Gather  (cost=1000.00..241061.04 rows=2014215 width=97)
   Workers Planned: 4
   ->  Parallel Seq Scan on pgbench_accounts  (cost=0.00..38639.54 rows=503554 width=97)
(3 rows)

PARALLEL ヒントの並列度パラメーターに値 6 が指定されています。 次の例では、値はワーカーの計画数として返されます。

EXPLAIN SELECT /*+ PARALLEL(pgbench_accounts 6) */ * FROM pgbench_accounts;

                                       QUERY PLAN
-----------------------------------------------------------------------------------------
 Gather  (cost=1000.00..239382.52 rows=2014215 width=97)
   Workers Planned: 6
   ->  Parallel Seq Scan on pgbench_accounts  (cost=0.00..36961.03 rows=335702 width=97)
(3 rows)

同じクエリが並列度の DEFAULT 設定で使用されます。 結果は、最大許容数のワーカーが計画されていることを示しています。

EXPLAIN SELECT /*+ PARALLEL(pgbench_accounts DEFAULT) */ * FROM pgbench_accounts;

                                       QUERY PLAN
-----------------------------------------------------------------------------------------
 Gather  (cost=1000.00..239382.52 rows=2014215 width=97)
   Workers Planned: 6
   ->  Parallel Seq Scan on pgbench_accounts  (cost=0.00..36961.03 rows=335702 width=97)
(3 rows)

pgbench_accounts テーブルが変更されました。 この表では、parallel_workers ストレージパラメーターが 3 に設定されています。

ALTER TABLE ステートメントが parallel_workers パラメーターを設定するこのフォーマットは、Oracle データベースと互換性がありません。

parallel_workers パラメーターは、PSQL \d+ 文によって設定されます。

ALTER TABLE pgbench_accounts SET (parallel_workers=3);

\d+ pgbench_accounts
                       Table "public.pgbench_accounts"
  Column  |     Type      | Modifiers | Storage  | Stats target | Description
----------+---------------+-----------+----------+--------------+-------------
 aid      | integer       | not null  | plain    |              |
 bid      | integer       |           | plain    |              |
 abalance | integer       |           | plain    |              |
 filler   | character(84) |           | extended |              |
Indexes:
    "pgbench_accounts_pkey" PRIMARY KEY, btree (aid)
Options: fillfactor=100, parallel_workers=3

PARALLEL ヒントに並列度が指定されていない場合、返される計画ワーカー数は、parallel_workers パラメーターの値です。

EXPLAIN SELECT /*+ PARALLEL(pgbench_accounts) */ * FROM pgbench_accounts;

                                       QUERY PLAN
-----------------------------------------------------------------------------------------
 Gather  (cost=1000.00..242522.97 rows=2014215 width=97)
   Workers Planned: 3
   ->  Parallel Seq Scan on pgbench_accounts  (cost=0.00..40101.47 rows=649747 width=97)
(3 rows)

PARALLEL ヒントの並列度の値または DEFAULT は、parallel_workers 設定を上書きします。

次の例は、NO_PARALLEL ヒントを示しています。 trace_hints が on に設定されている場合、NO_PARALLEL ヒントにより並列スキャンが拒否されたことを示す INFO: [HINTS] メッセージが表示されます。

EXPLAIN SELECT /*+ NO_PARALLEL(pgbench_accounts) */ * FROM pgbench_accounts;
INFO:  [HINTS] Parallel SeqScan of [pgbench_accounts] rejected due to NO_PARALLEL hint.
                                QUERY PLAN
---------------------------------------------------------------------------
 Seq Scan on pgbench_accounts  (cost=0.00..53746.15 rows=2014215 width=97)
(1 row)