hello ...

did you check out antonin houska's patches?
we basically got code, which can do that.

    many thanks,

        hans


On 04/02/2017 03:30 PM, Konstantin Knizhnik wrote:
> Hi hackers and personally Robet (you are the best expert in both areas).
> I want to ask one more question concerning parallel execution and FDW.
> Below are two plans for the same query (TPC-H Q5): one for normal
> tables, another for FDW to vertical representation of the same data.
> FDW supports analyze function and is expected to produce the similar
> statistic as for original tables.
>
> Query plans are the following:
>
> Normal tables:
>
>  Sort  (cost=2041588.48..2041588.98 rows=200 width=48)
>    Sort Key: (sum((lineitem.l_extendedprice * ('1'::double precision -
> lineitem.l_discount)))) DESC
>    ->  Finalize GroupAggregate  (cost=2041335.76..2041580.83 rows=200
> width=48)
>          Group Key: nation.n_name
>          ->  Gather Merge  (cost=2041335.76..2041568.33 rows=1400
> width=48)
>                Workers Planned: 7
>                ->  Partial GroupAggregate 
> (cost=2040335.64..2040396.71 rows=200 width=48)
>                      Group Key: nation.n_name
>                      ->  Sort  (cost=2040335.64..2040345.49 rows=3938
> width=40)
>                            Sort Key: nation.n_name
>                            ->  Hash Join  (cost=605052.97..2040100.48
> rows=3938 width=40)
>                                  Hash Cond: ((orders.o_custkey =
> customer.c_custkey) AND (nation.n_nationkey = customer.c_nationkey))
>                                  ->  Hash Join 
> (cost=525126.37..1951647.85 rows=98414 width=52)
>                                        Hash Cond: (lineitem.l_orderkey
> = orders.o_orderkey)
>                                        ->  Hash Join 
> (cost=3802.22..1404473.37 rows=654240 width=52)
>                                              Hash Cond:
> (lineitem.l_suppkey = supplier.s_suppkey)
>                                              ->  Parallel Seq Scan on
> lineitem  (cost=0.00..1361993.36 rows=8569436 width=16)
>                                              ->  Hash 
> (cost=3705.97..3705.97 rows=7700 width=44)
>                                                    ->  Hash Join 
> (cost=40.97..3705.97 rows=7700 width=44)
>                                                          Hash Cond:
> (supplier.s_nationkey = nation.n_nationkey)
>                                                          ->  Seq Scan
> on supplier  (cost=0.00..3090.00 rows=100000 width=8)
>                                                          ->  Hash 
> (cost=40.79..40.79 rows=15 width=36)
>                                                                -> 
> Hash Join  (cost=20.05..40.79 rows=15 width=36)
>                                                                     
> Hash Cond: (nation.n_regionkey = region.r_regionkey)
>                                                                     
> ->  Seq Scan on nation  (cost=0.00..17.70 rows=770 width=40)
>                                                                     
> ->  Hash  (cost=20.00..20.00 rows=4 width=4)
>                                                                           
> ->  Seq Scan on region  (cost=0.00..20.00 rows=4 width=4)
>                                                                               
>   
> Filter: ((r_name)::text = 'ASIA'::text)
>                                        ->  Hash 
> (cost=484302.37..484302.37 rows=2256542 width=8)
>                                              ->  Seq Scan on orders 
> (cost=0.00..484302.37 rows=2256542 width=8)
>                                                    Filter:
> ((o_orderdate >= '1996-01-01'::date) AND (o_orderdate <
> '1997-01-01'::date))
>                                  ->  Hash  (cost=51569.64..51569.64
> rows=1499864 width=8)
>                                        ->  Seq Scan on customer 
> (cost=0.00..51569.64 rows=1499864 width=8)
>
>
> Plan with FDW:
>
>  Sort  (cost=2337312.28..2337312.78 rows=200 width=48)
>    Sort Key: (sum((lineitem_fdw.l_extendedprice * ('1'::double
> precision - lineitem_fdw.l_discount)))) DESC
>    ->  GroupAggregate  (cost=2336881.54..2337304.64 rows=200 width=48)
>          Group Key: nation.n_name
>          ->  Sort  (cost=2336881.54..2336951.73 rows=28073 width=40)
>                Sort Key: nation.n_name
>                ->  Hash Join  (cost=396050.65..2334807.39 rows=28073
> width=40)
>                      Hash Cond: ((orders_fdw.o_custkey =
> customer_fdw.c_custkey) AND (nation.n_nationkey =
> customer_fdw.c_nationkey))
>                      ->  Hash Join  (cost=335084.53..2247223.46
> rows=701672 width=52)
>                            Hash Cond: (lineitem_fdw.l_orderkey =
> orders_fdw.o_orderkey)
>                            ->  Hash Join  (cost=2887.07..1786058.18
> rows=4607421 width=52)
>                                  Hash Cond: (lineitem_fdw.l_suppkey =
> supplier_fdw.s_suppkey)
>                                  ->  Foreign Scan on lineitem_fdw 
> (cost=0.00..1512151.52 rows=59986176 width=16)
>                                  ->  Hash  (cost=2790.80..2790.80
> rows=7702 width=44)
>                                        ->  Hash Join 
> (cost=40.97..2790.80 rows=7702 width=44)
>                                              Hash Cond:
> (supplier_fdw.s_nationkey = nation.n_nationkey)
>                                              ->  Foreign Scan on
> supplier_fdw  (cost=0.00..2174.64 rows=100032 width=8)
>                                              ->  Hash 
> (cost=40.79..40.79 rows=15 width=36)
>                                                    ->  Hash Join 
> (cost=20.05..40.79 rows=15 width=36)
>                                                          Hash Cond:
> (nation.n_regionkey = region.r_regionkey)
>                                                          ->  Seq Scan
> on nation  (cost=0.00..17.70 rows=770 width=40)
>                                                          ->  Hash 
> (cost=20.00..20.00 rows=4 width=4)
>                                                                ->  Seq
> Scan on region  (cost=0.00..20.00 rows=4 width=4)
>                                                                     
> Filter: ((r_name)::text = 'ASIA'::text)
>                            ->  Hash  (cost=294718.76..294718.76
> rows=2284376 width=8)
>                                  ->  Foreign Scan on orders_fdw 
> (cost=0.00..294718.76 rows=2284376 width=8)
>                      ->  Hash  (cost=32605.64..32605.64 rows=1500032
> width=8)
>                            ->  Foreign Scan on customer_fdw 
> (cost=0.00..32605.64 rows=1500032 width=8)
>
> The plans look very similar, but first one is parallel and second - not.
> My FDW provides implementation for IsForeignScanParallelSafe which
> returns true.
> I wonder what can prevent optimizer from using parallel plan in this case?
>
> Thank in advance,
> -- 
> Konstantin Knizhnik
> Postgres Professional: http://www.postgrespro.com
> The Russian Postgres Company

-- 
Hans-Jürgen Schönig
Cybertec Schönig & Schönig GmbH
Gröhrmühlgasse 26
A-2700 Wiener Neustadt
Web: http://www.postgresql-support.de, http://www.cybertec.at

Reply via email to