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 つのワーカーの使用が計画されていることを指定しています。
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 に設定されています。
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)