On Tue, 2020-12-01 at 14:38 +0700, mobigroup wrote:
> I have strange behaviour when EXPLAIN returns parallel execution plan but the query execution is not parallel. The
querylooks as
>
> SELECT
> plpgsql_function(...parameters…)
> FROM table as t
> WHERE id=1
> UNION ALL
> SELECT
> plpgsql_function(...parameters…)
> FROM table as t
> WHERE id=2
> UNION ALL
> ...
>
> EXPLAIN outputs looks ok:
>
> Append (cost=0.00..10.25 rows=8 width=32)
> -> Gather (cost=0.00..1.27 rows=1 width=32)
> Workers Planned: 8
> -> Parallel Seq Scan on table t (cost=0.00..1.27 rows=1 width=32)
> Filter: (id = 1)
> -> Gather (cost=0.00..1.27 rows=1 width=32)
> Workers Planned: 8
> -> Parallel Seq Scan on table t_1 (cost=0.00..1.27 rows=1 width=32)
> Filter: (id = 2)
> -> Gather (cost=0.00..1.27 rows=1 width=32)
> ...
>
>
> But the query still uses just one core and I see sequential RAISE NOTICE outputs from the function
plpgsql_function().
>
> select version();
> version
>
---------------------------------------------------------------------------------------------------------------------------------
> PostgreSQL 12.4 (Ubuntu 12.4-1.pgdg18.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0-3ubuntu1~18.04)
7.5.0,64-bit
The essential question here is when the function is executed, so you should use
EXPLAIN (VERBOSE) to see that.
Possible explanations:
- The function is executed after the "Gather" node.
Perhaps you didn't define it as PARALLEL SAFE.
- Perhaps the tables are small.
During a parallel sequential scan, each worker is assigned a range of blocks to scan,
so all rows found in a single block are scanned by a single worker.
Yours,
Laurenz Albe
--
Cybertec | https://www.cybertec-postgresql.com