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 節點指示計劃使用兩個工作線程。

說明 如果 trace_hints 設置為 on,則顯示 INFO: [HINTS] 行,表明 PARALLEL 已接受 pgbench_accounts 以及其他hint。對于其余示例,這些行將不會顯示,因為它們通常顯示相同的輸出(即 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 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。

說明 此格式的 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 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)