fanfuxiaoran opened a new issue, #840:
URL: https://github.com/apache/cloudberry/issues/840

   ### Apache Cloudberry version
   
   _No response_
   
   ### What happened
   
   TPCDS 39 SQL
   ```
   explain analyze with inv as
   (select w_warehouse_name,w_warehouse_sk,i_item_sk,d_moy
          ,stdev,mean, case mean when 0 then null else stdev/mean end cov
    from(select w_warehouse_name,w_warehouse_sk,i_item_sk,d_moy
               ,stddev_samp(inv_quantity_on_hand) 
stdev,avg(inv_quantity_on_hand) mean
         from inventory
             ,item
             ,warehouse
             ,date_dim
         where inv_item_sk = i_item_sk
           and inv_warehouse_sk = w_warehouse_sk
           and inv_date_sk = d_date_sk
           and d_year =1999
         group by w_warehouse_name,w_warehouse_sk,i_item_sk,d_moy) foo
    where case mean when 0 then 0 else stdev/mean end > 1)
   select inv1.w_warehouse_sk,inv1.i_item_sk,inv1.d_moy,inv1.mean, inv1.cov
           ,inv2.w_warehouse_sk,inv2.i_item_sk,inv2.d_moy,inv2.mean, inv2.cov
   from inv inv1,inv inv2
   where inv1.i_item_sk = inv2.i_item_sk
     and inv1.w_warehouse_sk =  inv2.w_warehouse_sk
     and inv1.d_moy=4
     and inv2.d_moy=4+1
   order by inv1.w_warehouse_sk,inv1.i_item_sk,inv1.d_moy,inv1.mean,inv1.cov
           ,inv2.d_moy,inv2.mean, inv2.cov;
   ```
   the result of `EXPLAIN ANALYZE`
   ```
                                                                                
                                QUERY PLAN
   
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Gather Motion 4:1  (slice1; segments: 4)  (cost=0.00..10611.03 rows=1 
width=56) (actual time=271918.249..271920.951 rows=1642 loops=1)
      Merge Key: share0_ref3.w_warehouse_sk, share0_ref3.i_item_sk, 
share0_ref3.d_moy, share0_ref3.mean, share0_ref3.cov, share0_ref2.d_moy, 
share0_ref2.mean, share0_ref2.cov
      ->  Sort  (cost=0.00..10611.03 rows=1 width=56) (actual 
time=271908.661..271908.745 rows=438 loops=1)
            Sort Key: share0_ref3.w_warehouse_sk, share0_ref3.i_item_sk, 
share0_ref3.d_moy, share0_ref3.mean, share0_ref3.cov, share0_ref2.d_moy, 
share0_ref2.mean, share0_ref2.cov
            Sort Method:  quicksort  Memory: 342kB
            ->  Sequence  (cost=0.00..10611.03 rows=1 width=56) (actual 
time=271899.415..271908.168 rows=438 loops=1)
                  ->  Shared Scan (share slice:id 1:0)  (cost=0.00..9749.03 
rows=1 width=1) (actual time=271396.666..271399.381 rows=15195 loops=1)
                        ->  Result  (cost=0.00..9749.03 rows=1 width=36) 
(actual time=270462.927..271390.897 rows=15195 loops=1)
                              Filter: (CASE 
(avg(inventory.inv_quantity_on_hand)) WHEN '0'::numeric THEN '0'::numeric ELSE 
((stddev_samp(inventory.inv_quantity_on_hand)) / 
(avg(inventory.inv_quantity_on_hand))) END > '1'::numeric)
                              ->  GroupAggregate  (cost=0.00..9749.03 rows=1 
width=36) (actual time=270702.186..271702.301 rows=255457 loops=1)
                                    Group Key: warehouse.w_warehouse_name, 
warehouse.w_warehouse_sk, item.i_item_sk, date_dim.d_moy
                                    ->  Sort  (cost=0.00..9749.03 rows=1 
width=24) (actual time=270702.115..270882.301 rows=1149680 loops=1)
                                          Sort Key: warehouse.w_warehouse_name, 
warehouse.w_warehouse_sk, item.i_item_sk, date_dim.d_moy
                                          Sort Method:  quicksort  Memory: 
576720kB
                                          ->  Redistribute Motion 4:4  (slice2; 
segments: 4)  (cost=0.00..9749.03 rows=1 width=24) (actual 
time=266582.489..268482.509 rows=1149680 loops=1)
                                                Hash Key: 
warehouse.w_warehouse_name, warehouse.w_warehouse_sk, item.i_item_sk, 
date_dim.d_moy
                                                ->  Hash Join  
(cost=0.00..9749.03 rows=1 width=24) (actual time=266579.279..267906.337 
rows=1155600 loops=1)
                                                      Hash Cond: 
(item.i_item_sk = inventory.inv_item_sk)
                                                      Extra Text: (seg3)   Hash 
chain length 92.2 avg, 360 max, using 49791 of 1048576 buckets.
                                                      ->  Seq Scan on item  
(cost=0.00..435.28 rows=25500 width=4) (actual time=13.391..63.298 rows=25692 
loops=1)
                                                      ->  Hash  
(cost=9309.07..9309.07 rows=1 width=24) (actual time=266564.791..266564.795 
rows=4590000 loops=1)
                                                            Buckets: 1048576  
Batches: 1  Memory Usage: 299550kB
                                                            ->  Broadcast 
Motion 4:4  (slice3; segments: 4)  (cost=0.00..9309.07 rows=1 width=24) (actual 
time=219859.695..264574.467 rows=4590000 loops=1)
                                                                  ->  Hash Join 
 (cost=0.00..9309.07 rows=1 width=24) (actual time=224132.763..262579.814 
rows=1530000 loops=1)
                                                                        Hash 
Cond: (date_dim.d_date_sk = inventory.inv_date_sk)
                                                                        Extra 
Text: (seg0)   Initial batch 0:
                                                                        ->  Seq 
Scan on date_dim  (cost=0.00..433.71 rows=27 width=8) (actual 
time=20.864..32.408 rows=17 loops=1)
                                                                              
Filter: ((d_year = 1999) AND ((d_moy = 4) OR (d_moy = 5)))
                                                                        ->  
Hash  (cost=8875.36..8875.36 rows=1 width=24) (actual 
time=219839.658..219839.662 rows=133110000 loops=1)
                                                                              
Buckets: 2097152 (originally 1048576)  Batches: 32 (originally 1)  Memory 
Usage: 507780kB
                                                                              
->  Broadcast Motion 4:4  (slice4; segments: 4)  (cost=0.00..8875.36 rows=1 
width=24)
   .179315.333 rows=133110000 loops=1)
                                                                                
    ->  Hash Join  (cost=0.00..8875.36 rows=1 width=24) (actual 
time=40.545..164455.
   ops=1)
                                                                                
          Hash Cond: (inventory.inv_warehouse_sk = warehouse.w_warehouse_sk)
                                                                                
          Extra Text: (seg3)   Hash chain length 1.0 avg, 1 max, using 10 of 
2097152 buckets.
                                                                                
          ->  Seq Scan on inventory  (cost=0.00..1346.13 rows=33277500 
width=16) (ac
   4895.814 rows=33282571 loops=1)
                                                                                
          ->  Hash  (cost=431.00..431.00 rows=1 width=12) (actual 
time=0.057..0.061 rows=10 loops=1)
                                                                                
                Buckets: 2097152  Batches: 1  Memory Usage: 16385kB
                                                                                
                ->  Broadcast Motion 4:4  (slice5; segments: 4)  
(cost=0.00..431.00
   tual time=0.020..0.029 rows=10 loops=1)
                                                                                
                      ->  Seq Scan on warehouse  (cost=0.00..431.00 rows=1 
width=12)
   .6.642 rows=4 loops=1)
                  ->  Hash Join  (cost=0.00..862.00 rows=1 width=56) (actual 
time=12.980..21.686 rows=438 loops=1)
                        Hash Cond: ((share0_ref3.i_item_sk = 
share0_ref2.i_item_sk) AND (share0_ref3.w_warehouse_sk = 
share0_ref2.w_warehouse_sk))
                        Extra Text: (seg0)   Hash chain length 1.0 avg, 2 max, 
using 8836 of 1048576 buckets.
                        ->  Redistribute Motion 4:4  (slice6; segments: 4)  
(cost=0.00..431.00 rows=1 width=28) (actual time=0.015..3.750 rows=6197 loops=1)
                              Hash Key: share0_ref3.i_item_sk, 
share0_ref3.w_warehouse_sk
                              ->  Result  (cost=0.00..431.00 rows=1 width=28) 
(actual time=271401.081..271407.101 rows=6253 loops=1)
                                    Filter: (share0_ref3.d_moy = 4)
                                    ->  Shared Scan (share slice:id 6:0)  
(cost=0.00..431.00 rows=1 width=28) (actual time=271401.067..271404.665 
rows=15195 loops=1)
                        ->  Hash  (cost=431.00..431.00 rows=1 width=28) (actual 
time=498.891..498.894 rows=8956 loops=1)
                              Buckets: 1048576  Batches: 1  Memory Usage: 8756kB
                              ->  Redistribute Motion 4:4  (slice7; segments: 
4)  (cost=0.00..431.00 rows=1 width=28) (actual time=0.035..495.240 rows=8956 
loops=1)
                                    Hash Key: share0_ref2.i_item_sk, 
share0_ref2.w_warehouse_sk
                                    ->  Result  (cost=0.00..431.00 rows=1 
width=28) (actual time=271381.034..271387.405 rows=8993 loops=1)
                                          Filter: (share0_ref2.d_moy = 5)
                                          ->  Shared Scan (share slice:id 7:0)  
(cost=0.00..431.00 rows=1 width=28) (actual time=271395.678..271398.164 
rows=15195 loops=1)
    Planning Time: 230.080 ms
      (slice0)    Executor memory: 741K bytes.
      (slice1)    Executor memory: 126218K bytes avg x 4x(0) workers, 126360K 
bytes max (seg3).  Work_mem: 68275K bytes max.
      (slice2)    Executor memory: 309091K bytes avg x 4x(0) workers, 309091K 
bytes max (seg0).  Work_mem: 299550K bytes max.
    * (slice3)    Executor memory: 554838K bytes avg x 4x(0) workers, 554893K 
bytes max (seg3).  Work_mem: 507780K bytes max, 8257772K bytes wanted.
      (slice4)    Executor memory: 16467K bytes avg x 4x(0) workers, 16467K 
bytes max (seg0).  Work_mem: 16385K bytes max.
      (slice5)    Executor memory: 27K bytes avg x 4x(0) workers, 27K bytes max 
(seg0).
      (slice6)    Executor memory: 80K bytes avg x 4x(0) workers, 80K bytes max 
(seg0).
      (slice7)    Executor memory: 80K bytes avg x 4x(0) workers, 80K bytes max 
(seg0).
    Memory used:  2097152kB
    Memory wanted:  74321941kB
    Optimizer: Pivotal Optimizer (GPORCA)
    Execution Time: 272064.651 ms
   ```
   It uses broadcast motion  instead of hash redistributed motion for the join 
result of `warehouse` and `inventory` as it estimates that there are only 1 row 
for the result.  For the join condition 'inventory.inv_warehouse_sk = 
warehouse.w_warehouse_sk' , orca doesn't know the foreign key info , so it 
gives out a wrong estimation.
   
   ### What you think should happen instead
   
   _No response_
   
   ### How to reproduce
   
    psql -U gpadmin -v ON_ERROR_STOP=1 -A -q -t -P pager=off -v 
EXPLAIN_ANALYZE=" " -f 
/home/gpadmin/workspace/TPC-DS-HashData/05_sql/139.dsbench.39.sql
   
   ### Operating System
   
   centos7
   
   ### Anything else
   
   _No response_
   
   ### Are you willing to submit PR?
   
   - [ ] Yes, I am willing to submit a PR!
   
   ### Code of Conduct
   
   - [X] I agree to follow this project's [Code of 
Conduct](https://github.com/apache/cloudberry/blob/main/CODE_OF_CONDUCT.md).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to