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 query looks 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



Reply via email to