Re: Parallel sec scan in plpgsql - Mailing list pgsql-hackers

From Alex Ignatov
Subject Re: Parallel sec scan in plpgsql
Date
Msg-id 8163e56a-c137-4dd9-5d3d-4505a6a9ac4e@postgrespro.ru
Whole thread Raw
In response to Re: Parallel sec scan in plpgsql  (Ashutosh Bapat <ashutosh.bapat@enterprisedb.com>)
Responses Re: Parallel sec scan in plpgsql
List pgsql-hackers
No it doesn't.
Paralleling neither sql function nor plpgsql:
Here is example :

ipdr=> show max_worker_processes ; max_worker_processes
---------------------- 128
(1 row)
ipdr=> set max_parallel_workers_per_gather to 128;
SET
ipdr=> set force_parallel_mode=on;
SET
ipdr=> set min_parallel_relation_size =0;
SET
ipdr=> set parallel_tuple_cost=0;
SET

ipdr=> create table test as select (random ()*1000)::int % 3 as a,
ipdr->                             (random ()*1000)::int % 5 as b,
ipdr->                             (random ()*1000)::int % 7 as c,
ipdr->                             (random ()*1000)::int % 11 as d,
ipdr->                             (random ()*1000)::int % 13 as e,
ipdr->                             (random ()*1000)::int % 17 as bytes
ipdr->                             from generate_series(1,10*1000*1000);
SELECT 10000000


ipdr=> create or replace function parallel_test_plpgsql() returns bigint as
ipdr-> $$
ipdr$> declare
ipdr$>    cnt int:=0;
ipdr$> begin
ipdr$>    select count(*) into cnt from (select a,b,c,d,e,sum(bytes) from test group by a,b,c,d,e)t;
ipdr$>    return cnt;
ipdr$> end;
ipdr$> $$ language plpgsql PARALLEL SAFE  STRICT;
CREATE FUNCTION

ipdr=>
ipdr=> create or replace function parallel_test_sql() returns bigint as
ipdr-> $$
ipdr$>    select count(*) from (select a,b,c,d,e,sum(bytes) from test group by a,b,c,d,e)t;
ipdr$> $$ language sql PARALLEL SAFE STRICT;
CREATE FUNCTION

ipdr=> analyze test;
ANALYZE
ipdr=> explain (analyze,buffers) select count(*) from (select a,b,c,d,e,sum(bytes) from test group by a,b,c,d,e)t;
                                                                   QUERY PLAN

-------------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=87702.33..87702.34 rows=1 width=8) (actual time=723.792..723.792 rows=1 loops=1)   Buffers: shared
hit=65015  ->  Finalize HashAggregate  (cost=87364.49..87514.64 rows=15015 width=28) (actual time=720.496..722.589
rows=15015loops=1)         Group Key: test.a, test.b, test.c, test.d, test.e         Buffers: shared hit=65015
-> Gather  (cost=85149.78..85299.93 rows=165165 width=20) (actual time=502.607..665.039 rows=180180 loops=1)
  Workers Planned: 11               Workers Launched: 11               Buffers: shared hit=65015               ->
PartialHashAggregate  (cost=84149.78..84299.93 rows=15015 width=20) (actual time=497.106..501.170 rows=15015 loops=12)
                  Group Key: test.a, test.b, test.c, test.d, test.e                     Buffers: shared hit=63695
             ->  Parallel Seq Scan on test  (cost=0.00..72786.01 rows=909101 width=20) (actual time=0.018..166.556
rows=833333loops=12)                           Buffers: shared hit=63695 Planning time: 0.250 ms Execution time:
724.293ms
 
(16 rows)

ipdr=> explain (analyze,buffers) select  parallel_test_plpgsql();                                           QUERY PLAN
------------------------------------------------------------------------------------------------ Gather
(cost=1000.00..1000.26rows=1 width=8) (actual time=4088.952..4088.956 rows=1 loops=1)   Workers Planned: 1   Workers
Launched:1   Single Copy: true   Buffers: shared hit=64186   ->  Result  (cost=0.00..0.26 rows=1 width=8) (actual
time=4084.997..4084.999rows=1 loops=1)         Buffers: shared hit=64149 Planning time: 0.025 ms Execution time:
4100.026ms
 
(9 rows)

Log from auto_explain:
2016-09-16 16:05:11 MSK [28209]: [1-1] user=,db=,app=,client= LOG:  duration: 4082.517 ms  plan:        Query Text:
selectcount(*)          from (select a,b,c,d,e,sum(bytes) from test group by a,b,c,d,e)t        Aggregate
(cost=289035.43..289035.44rows=1 width=8)          ->  HashAggregate  (cost=288697.59..288847.74 rows=15015 width=28)
            Group Key: test.a, test.b, test.c, test.d, test.e                ->  Seq Scan on test
(cost=0.00..163696.15rows=10000115 width=20)
 


ipdr=> explain (analyze,buffers) select  parallel_test_sql();                                           QUERY PLAN
------------------------------------------------------------------------------------------------ Gather
(cost=1000.00..1000.26rows=1 width=8) (actual time=4256.830..4256.837 rows=1 loops=1)   Workers Planned: 1   Workers
Launched:1   Single Copy: true   Buffers: shared hit=64132   ->  Result  (cost=0.00..0.26 rows=1 width=8) (actual
time=4252.401..4252.403rows=1 loops=1)         Buffers: shared hit=64095 Planning time: 0.151 ms Execution time:
4267.959ms
 
(9 rows)

Log from auto_explain:
2016-09-16 16:22:03 MSK [731]: [1-1] user=,db=,app=,client= LOG:  duration: 4249.851 ms  plan:        Query Text:
   select count(*) from (select a,b,c,d,e,sum(bytes) from test group by a,b,c,d,e)t;
 
        Aggregate  (cost=289035.43..289035.44 rows=1 width=8)          ->  HashAggregate  (cost=288697.59..288847.74
rows=15015width=28)                Group Key: test.a, test.b, test.c, test.d, test.e                ->  Seq Scan on
test (cost=0.00..163696.15 rows=10000115 width=20)
 



So as we can see parallel secscan doesn't works in plpgsql and sql functions.
Can somebody explains me where I was wrong?


Alex Ignatov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company


On 16.09.2016 07:27, Ashutosh Bapat wrote:
> On Thu, Sep 15, 2016 at 9:15 PM, Alex Ignatov <a.ignatov@postgrespro.ru> wrote:
>> Hello!
>> Does parallel secscan works in plpgsql?
>>
>
> Parallel seq scan is a query optimization that will work independent
> of the source of the query - i.e whether it comes directly from a
> client or a procedural language like plpgsql. So, I guess, answer to
> your question is yes. If you are expecting something else, more
> context will help.
>



pgsql-hackers by date:

Previous
From: Ashutosh Bapat
Date:
Subject: Re: Why postgres take RowExclusiveLock on all partition
Next
From: Robert Haas
Date:
Subject: Re: [PATCH] Transaction traceability - txid_status(bigint)