[ 
https://issues.apache.org/jira/browse/IMPALA-3760?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Greg Rahn updated IMPALA-3760:
------------------------------
    Labels: performance tpc-ds  (was: performance)

> Planner creates in-efficient join type for TPC-DS Q78
> -----------------------------------------------------
>
>                 Key: IMPALA-3760
>                 URL: https://issues.apache.org/jira/browse/IMPALA-3760
>             Project: IMPALA
>          Issue Type: Bug
>          Components: Frontend
>    Affects Versions: Impala 2.5.0
>            Reporter: Mostafa Mokhtar
>            Priority: Minor
>              Labels: performance, tpc-ds
>
> 19:HASH JOIN should be a PARTITIONED join yet the planner picks a broadcast 
> join, choosing BROADCAST Vs. PARTITIONED results in a 6x slowdown in the 
> query. 
> The wrong decision might be due to incorrect cardinality estimation of build 
> and probe side for join 19.
> Snippet for problematic join with BROADCAST
> {code}
>       HASH_JOIN_NODE (id=19):(Total: 8m54s, non-child: 4m5s, % non-child: 
> 46.00%)
>          - BuildPartitionTime: 1m41s
>          - BuildRows: 771.05M (771053773)
>          - BuildRowsPartitioned: 1.54B (1541927827)
>          - BuildTime: 2m9s
>          - GetNewBlockTime: 6s148ms
>          - HashBuckets: 2.15B (2147483648)
>          - HashCollisions: 142.75K (142747)
>          - LargestPartitionPercent: 6 (6)
>          - MaxPartitionLevel: 1 (1)
>          - NumRepartitions: 16 (16)
>          - PartitionsCreated: 272 (272)
>          - PeakMemoryUsage: 32.91 GB (35341572224)
>          - PinTime: 11s094ms
>          - ProbeRows: 3.22K (3222)
>          - ProbeRowsPartitioned: 3.22K (3222)
>          - ProbeTime: 23.812ms
>          - RowsReturned: 84.11K (84111)
>          - RowsReturnedRate: 156.00 /sec
>          - SpilledPartitions: 16 (16)
>          - UnpinTime: 11.937ms
> EXCHANGE_NODE (id=36):(Total: 4m14s, non-child: 51s153ms, % non-child: 20.14%)
>              - BytesReceived: 22.26 GB (23906000649)
>              - ConvertRowBatchTime: 11s254ms
>              - DeserializeRowBatchTimer: 57s224ms
>              - FirstBatchArrivalWaitTime: 46s181ms
>              - PeakMemoryUsage: 0
>              - RowsReturned: 771.05M (771053773)
>              - RowsReturnedRate: 3.04 M/sec
>              - SendersBlockedTimer: 997.004ms
>              - SendersBlockedTotalTimer(*): 23s133ms
> {code}
> Snippet for fast PARTITIONED join
> {code}
>     HASH_JOIN_NODE (id=19):(Total: 1m21s, non-child: 320.967ms, % non-child: 
> 0.40%)
>          - BuildPartitionTime: 2s294ms
>          - BuildRows: 12.64M (12640225)
>          - BuildRowsPartitioned: 12.64M (12640225)
>          - BuildTime: 1s989ms
>          - GetNewBlockTime: 2.918ms
>          - HashBuckets: 33.55M (33554432)
>          - HashCollisions: 0 (0)
>          - LargestPartitionPercent: 6 (6)
>          - MaxPartitionLevel: 0 (0)
>          - NumRepartitions: 0 (0)
>          - PartitionsCreated: 16 (16)
>          - PeakMemoryUsage: 1.66 GB (1782265446)
>          - PinTime: 0.000ns
>          - ProbeRows: 1.69K (1690)
>          - ProbeRowsPartitioned: 0 (0)
>          - ProbeTime: 9.016ms
>          - RowsReturned: 44.12K (44124)
>          - RowsReturnedRate: 543.00 /sec
>          - SpilledPartitions: 0 (0)
>          - UnpinTime: 0.000ns
> EXCHANGE_NODE (id=37):(Total: 55s735ms, non-child: 55s735ms, % non-child: 
> 100.00%)
>            - BytesReceived: 390.28 MB (409241789)
>            - ConvertRowBatchTime: 401.360ms
>            - DeserializeRowBatchTimer: 1s451ms
>            - FirstBatchArrivalWaitTime: 45s286ms
>            - PeakMemoryUsage: 0
>            - RowsReturned: 12.64M (12640225)
>            - RowsReturnedRate: 226.81 K/sec
>            - SendersBlockedTimer: 14.032ms
>            - SendersBlockedTotalTimer(*): 713.074ms
> {code}
> Query
> {code}
> with ws as
>   (select d_year AS ws_sold_year, ws_item_sk,
>     ws_bill_customer_sk ws_customer_sk,
>     sum(ws_quantity) ws_qty,
>     sum(ws_wholesale_cost) ws_wc,
>     sum(ws_sales_price) ws_sp
>    from web_sales
>    left join web_returns on wr_order_number=ws_order_number and 
> ws_item_sk=wr_item_sk
>    join date_dim on ws_sold_date_sk = d_date_sk
>    where wr_order_number is null
>    group by d_year, ws_item_sk, ws_bill_customer_sk
>    ),
> cs as
>   (select d_year AS cs_sold_year, cs_item_sk,
>     cs_bill_customer_sk cs_customer_sk,
>     sum(cs_quantity) cs_qty,
>     sum(cs_wholesale_cost) cs_wc,
>     sum(cs_sales_price) cs_sp
>    from catalog_sales
>    left join catalog_returns on cr_order_number=cs_order_number and 
> cs_item_sk=cr_item_sk
>    join date_dim on cs_sold_date_sk = d_date_sk
>    where cr_order_number is null
>    group by d_year, cs_item_sk, cs_bill_customer_sk
>    ),
> ss as
>   (select d_year AS ss_sold_year, ss_item_sk,
>     ss_customer_sk,
>     sum(ss_quantity) ss_qty,
>     sum(ss_wholesale_cost) ss_wc,
>     sum(ss_sales_price) ss_sp
>    from store_sales
>    left join store_returns on sr_ticket_number=ss_ticket_number and 
> ss_item_sk=sr_item_sk
>    join date_dim on ss_sold_date_sk = d_date_sk
>    where sr_ticket_number is null
>    group by d_year, ss_item_sk, ss_customer_sk
>    )
> select 
> ss_sold_year, ss_item_sk, ss_customer_sk,
> round(ss_qty/(coalesce(ws_qty+cs_qty,1)),2) ratio,
> ss_qty store_qty, ss_wc store_wholesale_cost, ss_sp store_sales_price,
> coalesce(ws_qty,0)+coalesce(cs_qty,0) other_chan_qty,
> coalesce(ws_wc,0)+coalesce(cs_wc,0) other_chan_wholesale_cost,
> coalesce(ws_sp,0)+coalesce(cs_sp,0) other_chan_sales_price
> from ss
> left join ws on (ws_sold_year=ss_sold_year and ws_item_sk=ss_item_sk and 
> ws_customer_sk=ss_customer_sk)
> left join cs on (cs_sold_year=ss_sold_year and cs_item_sk=cs_item_sk and 
> cs_customer_sk=ss_customer_sk)
> where coalesce(ws_qty,0)>0 and coalesce(cs_qty, 0)>0 and ss_sold_year=2000
> order by 
>   ss_sold_year, ss_item_sk, ss_customer_sk,
>   store_qty desc, store_wholesale_cost desc, store_sales_price desc,
>   other_chan_qty,
>   other_chan_wholesale_cost,
>   other_chan_sales_price,
>   ratio
> limit 100
> {code}
> Inefficient plan
> {code}
> 37:MERGING-EXCHANGE [UNPARTITIONED]
> |  order by: ss_sold_year ASC, ss_item_sk ASC, ss_customer_sk ASC, ss_qty 
> DESC,
> |  limit: 100
> |  hosts=32 per-host-mem=unavailable
> |  tuple-ids=15 row-size=136B cardinality=100
> |
> 20:TOP-N [LIMIT=100]
> |  order by: ss_sold_year ASC, ss_item_sk ASC, ss_customer_sk ASC, ss_qty 
> DESC, 
> |  hosts=32 per-host-mem=13.28KB
> |  tuple-ids=15 row-size=136B cardinality=100
> |
> 19:HASH JOIN [LEFT OUTER JOIN, BROADCAST]
> |  hash predicates: d_year = d_year, ss_customer_sk = cs_bill_customer_sk
> |  other predicates: coalesce(sum(cs_quantity), 0) > 0
> |  hosts=32 per-host-mem=5.03GB
> |  tuple-ids=3,8N,13N row-size=168B cardinality=1766829035
> |
> |--36:EXCHANGE [BROADCAST]
> |  |  hosts=32 per-host-mem=0B
> |  |  tuple-ids=13 row-size=56B cardinality=87718532
> |  |
> |  35:AGGREGATE [FINALIZE]
> |  |  output: sum:merge(cs_quantity), sum:merge(cs_wholesale_cost), 
> sum:merge(cs_sales_price)
> |  |  group by: d_year, cs_item_sk, cs_bill_customer_sk
> |  |  having: coalesce(sum(cs_quantity), 0) > 0
> |  |  hosts=32 per-host-mem=5.03GB
> |  |  tuple-ids=13 row-size=56B cardinality=87718532
> |  |
> |  34:EXCHANGE [HASH(d_year,cs_item_sk,cs_bill_customer_sk)]
> |  |  hosts=32 per-host-mem=0B
> |  |  tuple-ids=13 row-size=56B cardinality=87718532
> |  |
> |  17:AGGREGATE [STREAMING]
> |  |  output: sum(cs_quantity), sum(cs_wholesale_cost), sum(cs_sales_price)
> |  |  group by: d_year, cs_item_sk, cs_bill_customer_sk
> |  |  hosts=32 per-host-mem=5.03GB
> |  |  tuple-ids=13 row-size=56B cardinality=87718532
> |  |
> |  16:HASH JOIN [INNER JOIN, BROADCAST]
> |  |  hash predicates: cs_sold_date_sk = d_date_sk
> |  |  runtime filters: RF002 <- d_date_sk
> |  |  hosts=32 per-host-mem=3.21KB
> |  |  tuple-ids=10,11N,12 row-size=60B cardinality=87718532
> |  |
> |  |--33:EXCHANGE [BROADCAST]
> |  |  |  hosts=1 per-host-mem=0B
> |  |  |  tuple-ids=12 row-size=8B cardinality=373
> |  |  |
> |  |  14:SCAN HDFS [date_dim, RANDOM]
> |  |     partitions=1/1 files=1 size=2.15MB
> |  |     predicates: date_dim.d_year = 2000
> |  |     table stats: 73049 rows total
> |  |     column stats: all
> |  |     hosts=1 per-host-mem=32.00MB
> |  |     tuple-ids=12 row-size=8B cardinality=373
> |  |
> |  15:HASH JOIN [LEFT OUTER JOIN, PARTITIONED]
> |  |  hash predicates: cs_order_number = cr_order_number, cs_item_sk = 
> cr_item_sk
> |  |  other predicates: cr_order_number IS NULL
> |  |  hosts=32 per-host-mem=22.66MB
> |  |  tuple-ids=10,11N row-size=52B cardinality=432007888
> |  |
> |  |--32:EXCHANGE [HASH(cr_order_number,cr_item_sk)]
> |  |  |  hosts=32 per-host-mem=0B
> |  |  |  tuple-ids=11 row-size=16B cardinality=43201803
> |  |  |
> |  |  13:SCAN HDFS [catalog_returns, RANDOM]
> |  |     partitions=2104/2104 files=2104 size=32.99GB
> |  |     predicates: catalog_returns.cr_item_sk = catalog_returns.cr_item_sk
> |  |     table stats: 432018033 rows total
> |  |     column stats: all
> |  |     hosts=32 per-host-mem=64.00MB
> |  |     tuple-ids=11 row-size=16B cardinality=43201803
> |  |
> |  31:EXCHANGE [HASH(cs_order_number,cs_item_sk)]
> |  |  hosts=32 per-host-mem=0B
> |  |  tuple-ids=10 row-size=36B cardinality=432007888
> |  |
> |  12:SCAN HDFS [catalog_sales, RANDOM]
> |     partitions=1837/1837 files=2143 size=282.31GB
> |     predicates: catalog_sales.cs_item_sk = catalog_sales.cs_item_sk
> |     runtime filters: RF002 -> cs_sold_date_sk
> |     table stats: 4320078880 rows total
> |     column stats: all
> |     hosts=32 per-host-mem=528.00MB
> |     tuple-ids=10 row-size=36B cardinality=432007888
> |
> 18:HASH JOIN [LEFT OUTER JOIN, PARTITIONED]
> |  hash predicates: d_year = d_year, ss_item_sk = ws_item_sk, ss_customer_sk 
> = ws_bill_customer_sk
> |  other predicates: coalesce(sum(ws_quantity), 0) > 0
> |  hosts=32 per-host-mem=810.89MB
> |  tuple-ids=3,8N row-size=112B cardinality=1766829035
> |
> |--30:AGGREGATE [FINALIZE]
> |  |  output: sum:merge(ws_quantity), sum:merge(ws_wholesale_cost), 
> sum:merge(ws_sales_price)
> |  |  group by: d_year, ws_item_sk, ws_bill_customer_sk
> |  |  having: coalesce(sum(ws_quantity), 0) > 0
> |  |  hosts=32 per-host-mem=25.34GB
> |  |  tuple-ids=8 row-size=56B cardinality=441704163
> |  |
> |  29:EXCHANGE [HASH(d_year,ws_item_sk,ws_bill_customer_sk)]
> |  |  hosts=32 per-host-mem=0B
> |  |  tuple-ids=8 row-size=56B cardinality=441704163
> |  |
> |  11:AGGREGATE [STREAMING]
> |  |  output: sum(ws_quantity), sum(ws_wholesale_cost), sum(ws_sales_price)
> |  |  group by: d_year, ws_item_sk, ws_bill_customer_sk
> |  |  hosts=32 per-host-mem=25.34GB
> |  |  tuple-ids=8 row-size=56B cardinality=441704163
> |  |
> |  10:HASH JOIN [INNER JOIN, BROADCAST]
> |  |  hash predicates: ws_sold_date_sk = d_date_sk
> |  |  runtime filters: RF001 <- d_date_sk
> |  |  hosts=32 per-host-mem=3.21KB
> |  |  tuple-ids=5,6N,7 row-size=60B cardinality=441704163
> |  |
> |  |--28:EXCHANGE [BROADCAST]
> |  |  |  hosts=1 per-host-mem=0B
> |  |  |  tuple-ids=7 row-size=8B cardinality=373
> |  |  |
> |  |  08:SCAN HDFS [date_dim, RANDOM]
> |  |     partitions=1/1 files=1 size=2.15MB
> |  |     predicates: date_dim.d_year = 2000
> |  |     table stats: 73049 rows total
> |  |     column stats: all
> |  |     hosts=1 per-host-mem=32.00MB
> |  |     tuple-ids=7 row-size=8B cardinality=373
> |  |
> |  09:HASH JOIN [LEFT OUTER JOIN, PARTITIONED]
> |  |  hash predicates: ws_order_number = wr_order_number, ws_item_sk = 
> wr_item_sk
> |  |  other predicates: wr_order_number IS NULL
> |  |  hosts=32 per-host-mem=113.30MB
> |  |  tuple-ids=5,6N row-size=52B cardinality=2159968881
> |  |
> |  |--27:EXCHANGE [HASH(wr_order_number,wr_item_sk)]
> |  |  |  hosts=32 per-host-mem=0B
> |  |  |  tuple-ids=6 row-size=16B cardinality=216003761
> |  |  |
> |  |  07:SCAN HDFS [web_returns, RANDOM]
> |  |     partitions=2185/2185 files=2186 size=16.89GB
> |  |     table stats: 216003761 rows total
> |  |     column stats: all
> |  |     hosts=32 per-host-mem=32.00MB
> |  |     tuple-ids=6 row-size=16B cardinality=216003761
> |  |
> |  26:EXCHANGE [HASH(ws_order_number,ws_item_sk)]
> |  |  hosts=32 per-host-mem=0B
> |  |  tuple-ids=5 row-size=36B cardinality=2159968881
> |  |
> |  06:SCAN HDFS [web_sales, RANDOM]
> |     partitions=1824/1824 files=1824 size=138.28GB
> |     runtime filters: RF001 -> ws_sold_date_sk
> |     table stats: 2159968881 rows total
> |     column stats: all
> |     hosts=32 per-host-mem=528.00MB
> |     tuple-ids=5 row-size=36B cardinality=2159968881
> |
> 25:AGGREGATE [FINALIZE]
> |  output: sum:merge(ss_quantity), sum:merge(ss_wholesale_cost), 
> sum:merge(ss_sales_price)
> |  group by: d_year, ss_item_sk, ss_customer_sk
> |  hosts=32 per-host-mem=101.36GB
> |  tuple-ids=3 row-size=56B cardinality=1766829035
> |
> 24:EXCHANGE [HASH(d_year,ss_item_sk,ss_customer_sk)]
> |  hosts=32 per-host-mem=0B
> |  tuple-ids=3 row-size=56B cardinality=1766829035
> |
> 05:AGGREGATE [STREAMING]
> |  output: sum(ss_quantity), sum(ss_wholesale_cost), sum(ss_sales_price)
> |  group by: d_year, ss_item_sk, ss_customer_sk
> |  hosts=32 per-host-mem=101.36GB
> |  tuple-ids=3 row-size=56B cardinality=1766829035
> |
> 04:HASH JOIN [INNER JOIN, BROADCAST]
> |  hash predicates: ss_sold_date_sk = d_date_sk
> |  runtime filters: RF000 <- d_date_sk
> |  hosts=32 per-host-mem=3.21KB
> |  tuple-ids=0,1N,2 row-size=60B cardinality=1766829035
> |
> |--23:EXCHANGE [BROADCAST]
> |  |  hosts=1 per-host-mem=0B
> |  |  tuple-ids=2 row-size=8B cardinality=373
> |  |
> |  02:SCAN HDFS [date_dim, RANDOM]
> |     partitions=1/1 files=1 size=2.15MB
> |     predicates: date_dim.d_year = 2000
> |     table stats: 73049 rows total
> |     column stats: all
> |     hosts=1 per-host-mem=32.00MB
> |     tuple-ids=2 row-size=8B cardinality=373
> |
> 03:HASH JOIN [LEFT OUTER JOIN, PARTITIONED]
> |  hash predicates: ss_ticket_number = sr_ticket_number, ss_item_sk = 
> sr_item_sk
> |  other predicates: sr_ticket_number IS NULL
> |  hosts=32 per-host-mem=453.18MB
> |  tuple-ids=0,1N row-size=52B cardinality=8639936081
> |
> |--22:EXCHANGE [HASH(sr_ticket_number,sr_item_sk)]
> |  |  hosts=32 per-host-mem=0B
> |  |  tuple-ids=1 row-size=16B cardinality=863989652
> |  |
> |  01:SCAN HDFS [store_returns, RANDOM]
> |     partitions=2004/2004 files=2008 size=48.75GB
> |     table stats: 863989652 rows total
> |     column stats: all
> |     hosts=32 per-host-mem=80.00MB
> |     tuple-ids=1 row-size=16B cardinality=863989652
> |
> 21:EXCHANGE [HASH(ss_ticket_number,ss_item_sk)]
> |  hosts=32 per-host-mem=0B
> |  tuple-ids=0 row-size=36B cardinality=8639936081
> |
> 00:SCAN HDFS [store_sales, RANDOM]
>    partitions=1824/1824 files=2649 size=376.63GB
>    runtime filters: RF000 -> ss_sold_date_sk
>    table stats: 8639936081 rows total
>    column stats: all
>    hosts=32 per-host-mem=528.00MB
>    tuple-ids=0 row-size=36B cardinality=8639936081
> {code}
> Query
> {code}
> with ws as
>   (select d_year AS ws_sold_year, ws_item_sk,
>     ws_bill_customer_sk ws_customer_sk,
>     sum(ws_quantity) ws_qty,
>     sum(ws_wholesale_cost) ws_wc,
>     sum(ws_sales_price) ws_sp
>    from web_sales
>    left join web_returns on wr_order_number=ws_order_number and 
> ws_item_sk=wr_item_sk
>    join date_dim on ws_sold_date_sk = d_date_sk
>    where wr_order_number is null
>    group by d_year, ws_item_sk, ws_bill_customer_sk
>    ),
> cs as
>   (select d_year AS cs_sold_year, cs_item_sk,
>     cs_bill_customer_sk cs_customer_sk,
>     sum(cs_quantity) cs_qty,
>     sum(cs_wholesale_cost) cs_wc,
>     sum(cs_sales_price) cs_sp
>    from catalog_sales
>    left join catalog_returns on cr_order_number=cs_order_number and 
> cs_item_sk=cr_item_sk
>    join date_dim on cs_sold_date_sk = d_date_sk
>    where cr_order_number is null
>    group by d_year, cs_item_sk, cs_bill_customer_sk
>    ),
> ss as
>   (select d_year AS ss_sold_year, ss_item_sk,
>     ss_customer_sk,
>     sum(ss_quantity) ss_qty,
>     sum(ss_wholesale_cost) ss_wc,
>     sum(ss_sales_price) ss_sp
>    from store_sales
>    left join store_returns on sr_ticket_number=ss_ticket_number and 
> ss_item_sk=sr_item_sk
>    join date_dim on ss_sold_date_sk = d_date_sk
>    where sr_ticket_number is null
>    group by d_year, ss_item_sk, ss_customer_sk
>    )
> select 
> ss_sold_year, ss_item_sk, ss_customer_sk,
> round(ss_qty/(coalesce(ws_qty+cs_qty,1)),2) ratio,
> ss_qty store_qty, ss_wc store_wholesale_cost, ss_sp store_sales_price,
> coalesce(ws_qty,0)+coalesce(cs_qty,0) other_chan_qty,
> coalesce(ws_wc,0)+coalesce(cs_wc,0) other_chan_wholesale_cost,
> coalesce(ws_sp,0)+coalesce(cs_sp,0) other_chan_sales_price
> from ss
> left join ws on (ws_sold_year=ss_sold_year and ws_item_sk=ss_item_sk and 
> ws_customer_sk=ss_customer_sk)
> left join cs on (cs_sold_year=ss_sold_year and cs_item_sk=cs_item_sk and 
> cs_customer_sk=ss_customer_sk)
> where coalesce(ws_qty,0)>0 and coalesce(cs_qty, 0)>0 and ss_sold_year=2000
> order by 
>   ss_sold_year, ss_item_sk, ss_customer_sk,
>   store_qty desc, store_wholesale_cost desc, store_sales_price desc,
>   other_chan_qty,
>   other_chan_wholesale_cost,
>   other_chan_sales_price,
>   ratio
> limit 100
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

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

Reply via email to