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)