PARALLEL optimizer hint用于強制執行并行掃描;NO_PARALLEL optimizer hint阻止使用并行掃描。
摘要
PARALLEL (table [ parallel_degree | DEFAULT ])
NO_PARALLEL (table)
說明
并行掃描是指使用多個后臺工作線程同時執行給定查詢的表(即并行)掃描。與其他方法(如順序掃描)相比,此過程可提供性能改進。
參數
參數 | 說明 |
---|---|
table | 要應用并行hint的表。 |
parallel_degree | DEFAULT | parallel_degree是一個正整數,指定用于并行掃描所需的工作線程數。如果指定,則parallel_degree和配置參數max_parallel_workers_per_gather中較小者將用作計劃的工作線程數。有關max_parallel_workers_per_gather參數的信息,請參見max_parallel_workers_per_gather。
如果已指定 DEFAULT,則使用最大可能的并行度。 如果省略 parallel_degree 和 DEFAULT,則查詢優化器確定并行度。在這種情況下,如果 table 已使用parallel_workers存儲參數設置,則該值用作并行度;否則,優化器使用如 DEFAULT 所指定的最大可能并行度。有關parallel_workers存儲參數的信息,請參見parallel_workers。 無論情況如何,并行度絕不會超過配置參數 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 hint。在查詢計劃中,啟動后臺工作線程的 Gather 節點指示計劃使用兩個工作線程。
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 hint中指定的并行度。請注意,計劃的工作線程數已增加到 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 hint的并行度參數指定的值為 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 hint不帶并行度提供時,產生的計劃工作線程數是 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 hint中指定并行度值或 DEFAULT 會覆蓋 parallel_workers 設置。
以下示例顯示 NO_PARALLEL hint。請注意,trace_hints 設置為 on 時,INFO: [HINTS] 消息表明由于 NO_PARALLEL hint而拒絕并行掃描。
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)