Uploaded image for project: 'Hive'
  1. Hive
  2. HIVE-8315

CBO : Negate condition underestimates selectivity which results in an in-efficient plan

Log workAgile BoardRank to TopRank to BottomBulk Copy AttachmentsBulk Move AttachmentsVotersWatch issueWatchersCreate sub-taskConvert to sub-taskMoveLinkCloneLabelsUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 0.14.0
    • 0.14.0
    • CBO
    • None

    Description

      For TPC-DS Q64 the predicate cd1.cd_marital_status <> cd2.cd_marital_status under estimate the join selectivity by a huge margin and results in in-efficient join order.

      This is a subset of the logical plan showing that item was joined very last

                                      HiveJoinRel(condition=[=($0, $37)], joinType=[inner]): rowcount = 1.0, cumulative cost = {6.386017602518958E8 rows, 0.0 cpu, 0.0 io}, id = 3790
                                        HiveJoinRel(condition=[=($0, $33)], joinType=[inner]): rowcount = 1.0, cumulative cost = {6.386017582518958E8 rows, 0.0 cpu, 0.0 io}, id = 3067
                                          HiveFilterRel(condition=[<>($30, $32)]): rowcount = 1.8252236387887635, cumulative cost = {6.386017554266721E8 rows, 0.0 cpu, 0.0 io}, id = 1153
                                            HiveProjectRel(ss_item_sk=[$2], ss_customer_sk=[$3], ss_cdemo_sk=[$4], ss_hdemo_sk=[$5], ss_addr_sk=[$6], ss_store_sk=[$7], ss_promo_sk=[$8], ss_ticket_number=[$9], ss_wholesale_cost=[$10], ss_list_price=[$11], ss_coupon_amt=[$12], ss_sold_date_sk=[$13], sr_item_sk=[$0], sr_ticket_number=[$1], c_customer_sk=[$23], c_current_cdemo_sk=[$24], c_current_hdemo_sk=[$25], c_current_addr_sk=[$26], c_first_shipto_date_sk=[$27], c_first_sales_date_sk=[$28], d_date_sk=[$14], d_year=[$15], d_date_sk0=[$29], d_year0=[$30], d_date_sk1=[$31], d_year1=[$32], s_store_sk=[$18], s_store_name=[$19], s_zip=[$20], cd_demo_sk=[$16], cd_marital_status=[$17], cd_demo_sk0=[$21], cd_marital_status0=[$22]): rowcount = 3.6246005783468924E7, cumulative cost = {6.386017554266721E8 rows, 0.0 cpu, 0.0 io}, id = 2312
                                              HiveJoinRel(condition=[AND(=($2, $0), =($9, $1))], joinType=[inner]): rowcount = 3.6246005783468924E7, cumulative cost = {6.386017554266721E8 rows, 0.0 cpu, 0.0 io}, id = 2310
                                                HiveProjectRel(sr_item_sk=[$1], sr_ticket_number=[$8]): rowcount = 5.5578005E7, cumulative cost = {0.0 rows, 0.0 cpu, 0.0 io}, id = 912
                                                  HiveTableScanRel(table=[[tpcds_bin_partitioned_orc_200_orig.store_returns]]): rowcount = 5.5578005E7, cumulative cost = {0}, id = 62
                                                HiveJoinRel(condition=[=($1, $21)], joinType=[inner]): rowcount = 1.2950939439433252E7, cumulative cost = {5.700728109872389E8 rows, 0.0 cpu, 0.0 io}, id = 2308
                                                  HiveJoinRel(condition=[=($5, $16)], joinType=[inner]): rowcount = 5491530.921341597, cumulative cost = {5.629812800658973E8 rows, 0.0 cpu, 0.0 io}, id = 2301
                                                    HiveJoinRel(condition=[=($2, $14)], joinType=[inner]): rowcount = 5491530.921341597, cumulative cost = {5.574895371445558E8 rows, 0.0 cpu, 0.0 io}, id = 2299
                                                      HiveJoinRel(condition=[=($11, $12)], joinType=[inner]): rowcount = 5491530.921341597, cumulative cost = {5.500772062232143E8 rows, 0.0 cpu, 0.0 io}, id = 1898
                                                        HiveProjectRel(ss_item_sk=[$1], ss_customer_sk=[$2], ss_cdemo_sk=[$3], ss_hdemo_sk=[$4], ss_addr_sk=[$5], ss_store_sk=[$6], ss_promo_sk=[$7], ss_ticket_number=[$8], ss_wholesale_cost=[$10], ss_list_price=[$11], ss_coupon_amt=[$18], ss_sold_date_sk=[$22]): rowcount = 5.50076554E8, cumulative cost = {0.0 rows, 0.0 cpu, 0.0 io}, id = 909
                                                          HiveTableScanRel(table=[[tpcds_bin_partitioned_orc_200_orig.store_sales]]): rowcount = 5.50076554E8, cumulative cost = {0}, id = 55

      Query

      select cs1.product_name ,cs1.store_name ,cs1.store_zip ,cs1.b_street_number ,cs1.b_streen_name ,cs1.b_city
           ,cs1.b_zip ,cs1.c_street_number ,cs1.c_street_name ,cs1.c_city ,cs1.c_zip ,cs1.syear ,cs1.cnt
           ,cs1.s1 ,cs1.s2 ,cs1.s3
           ,cs2.s1 ,cs2.s2 ,cs2.s3 ,cs2.syear ,cs2.cnt
      from
      (select i_product_name as product_name ,i_item_sk as item_sk ,s_store_name as store_name
           ,s_zip as store_zip ,ad1.ca_street_number as b_street_number ,ad1.ca_street_name as b_streen_name
           ,ad1.ca_city as b_city ,ad1.ca_zip as b_zip ,ad2.ca_street_number as c_street_number
           ,ad2.ca_street_name as c_street_name ,ad2.ca_city as c_city ,ad2.ca_zip as c_zip
           ,d1.d_year as syear ,d2.d_year as fsyear ,d3.d_year as s2year ,count(*) as cnt
           ,sum(ss_wholesale_cost) as s1 ,sum(ss_list_price) as s2 ,sum(ss_coupon_amt) as s3
        FROM   store_sales
              JOIN store_returns ON store_sales.ss_item_sk = store_returns.sr_item_sk and store_sales.ss_ticket_number = store_returns.sr_ticket_number
              JOIN customer ON store_sales.ss_customer_sk = customer.c_customer_sk
              JOIN date_dim d1 ON store_sales.ss_sold_date_sk = d1.d_date_sk
              JOIN date_dim d2 ON customer.c_first_sales_date_sk = d2.d_date_sk 
              JOIN date_dim d3 ON customer.c_first_shipto_date_sk = d3.d_date_sk
              JOIN store ON store_sales.ss_store_sk = store.s_store_sk
              JOIN customer_demographics cd1 ON store_sales.ss_cdemo_sk= cd1.cd_demo_sk
              JOIN customer_demographics cd2 ON customer.c_current_cdemo_sk = cd2.cd_demo_sk
              JOIN promotion ON store_sales.ss_promo_sk = promotion.p_promo_sk
              JOIN household_demographics hd1 ON store_sales.ss_hdemo_sk = hd1.hd_demo_sk
              JOIN household_demographics hd2 ON customer.c_current_hdemo_sk = hd2.hd_demo_sk
              JOIN customer_address ad1 ON store_sales.ss_addr_sk = ad1.ca_address_sk
              JOIN customer_address ad2 ON customer.c_current_addr_sk = ad2.ca_address_sk
              JOIN income_band ib1 ON hd1.hd_income_band_sk = ib1.ib_income_band_sk
              JOIN income_band ib2 ON hd2.hd_income_band_sk = ib2.ib_income_band_sk
              JOIN item ON store_sales.ss_item_sk = item.i_item_sk
              JOIN
       (select cs_item_sk
              ,sum(cs_ext_list_price) as sale,sum(cr_refunded_cash+cr_reversed_charge+cr_store_credit) as refund
        from catalog_sales JOIN catalog_returns
        ON catalog_sales.cs_item_sk = catalog_returns.cr_item_sk
          and catalog_sales.cs_order_number = catalog_returns.cr_order_number
        group by cs_item_sk
        having sum(cs_ext_list_price)>2*sum(cr_refunded_cash+cr_reversed_charge+cr_store_credit)) cs_ui
      ON store_sales.ss_item_sk = cs_ui.cs_item_sk
        WHERE  
               cd1.cd_marital_status <> cd2.cd_marital_status and
               i_color in ('maroon','burnished','dim','steel','navajo','chocolate') and
               i_current_price between 35 and 35 + 10 and
               i_current_price between 35 + 1 and 35 + 15
      group by i_product_name ,i_item_sk ,s_store_name ,s_zip ,ad1.ca_street_number
             ,ad1.ca_street_name ,ad1.ca_city ,ad1.ca_zip ,ad2.ca_street_number
             ,ad2.ca_street_name ,ad2.ca_city ,ad2.ca_zip ,d1.d_year ,d2.d_year ,d3.d_year
      ) cs1
      JOIN
      (select i_product_name as product_name ,i_item_sk as item_sk ,s_store_name as store_name
           ,s_zip as store_zip ,ad1.ca_street_number as b_street_number ,ad1.ca_street_name as b_streen_name
           ,ad1.ca_city as b_city ,ad1.ca_zip as b_zip ,ad2.ca_street_number as c_street_number
           ,ad2.ca_street_name as c_street_name ,ad2.ca_city as c_city ,ad2.ca_zip as c_zip
           ,d1.d_year as syear ,d2.d_year as fsyear ,d3.d_year as s2year ,count(*) as cnt
           ,sum(ss_wholesale_cost) as s1 ,sum(ss_list_price) as s2 ,sum(ss_coupon_amt) as s3
        FROM   store_sales
              JOIN store_returns ON store_sales.ss_item_sk = store_returns.sr_item_sk and store_sales.ss_ticket_number = store_returns.sr_ticket_number
              JOIN customer ON store_sales.ss_customer_sk = customer.c_customer_sk
              JOIN date_dim d1 ON store_sales.ss_sold_date_sk = d1.d_date_sk
              JOIN date_dim d2 ON customer.c_first_sales_date_sk = d2.d_date_sk 
              JOIN date_dim d3 ON customer.c_first_shipto_date_sk = d3.d_date_sk
              JOIN store ON store_sales.ss_store_sk = store.s_store_sk
              JOIN customer_demographics cd1 ON store_sales.ss_cdemo_sk= cd1.cd_demo_sk
              JOIN customer_demographics cd2 ON customer.c_current_cdemo_sk = cd2.cd_demo_sk
              JOIN promotion ON store_sales.ss_promo_sk = promotion.p_promo_sk
              JOIN household_demographics hd1 ON store_sales.ss_hdemo_sk = hd1.hd_demo_sk
              JOIN household_demographics hd2 ON customer.c_current_hdemo_sk = hd2.hd_demo_sk
              JOIN customer_address ad1 ON store_sales.ss_addr_sk = ad1.ca_address_sk
              JOIN customer_address ad2 ON customer.c_current_addr_sk = ad2.ca_address_sk
              JOIN income_band ib1 ON hd1.hd_income_band_sk = ib1.ib_income_band_sk
              JOIN income_band ib2 ON hd2.hd_income_band_sk = ib2.ib_income_band_sk
              JOIN item ON store_sales.ss_item_sk = item.i_item_sk
              JOIN
       (select cs_item_sk
              ,sum(cs_ext_list_price) as sale,sum(cr_refunded_cash+cr_reversed_charge+cr_store_credit) as refund
        from catalog_sales JOIN catalog_returns
        ON catalog_sales.cs_item_sk = catalog_returns.cr_item_sk
          and catalog_sales.cs_order_number = catalog_returns.cr_order_number
        group by cs_item_sk
        having sum(cs_ext_list_price)>2*sum(cr_refunded_cash+cr_reversed_charge+cr_store_credit)) cs_ui
      ON store_sales.ss_item_sk = cs_ui.cs_item_sk
        WHERE  
               cd1.cd_marital_status <> cd2.cd_marital_status and
               i_color in ('maroon','burnished','dim','steel','navajo','chocolate') and
               i_current_price between 35 and 35 + 10 and
               i_current_price between 35 + 1 and 35 + 15
      group by i_product_name ,i_item_sk ,s_store_name ,s_zip ,ad1.ca_street_number
             ,ad1.ca_street_name ,ad1.ca_city ,ad1.ca_zip ,ad2.ca_street_number
             ,ad2.ca_street_name ,ad2.ca_city ,ad2.ca_zip ,d1.d_year ,d2.d_year ,d3.d_year
      ) cs2
      ON cs1.item_sk=cs2.item_sk
      where 
           cs1.syear = 2000 and
           cs2.syear = 2000 + 1 and
           cs2.cnt <= cs1.cnt and
           cs1.store_name = cs2.store_name and
           cs1.store_zip = cs2.store_zip
      order by cs1.product_name ,cs1.store_name ,cs2.cnt
      

      Attachments

        1. HIVE-8315.1.patch
          2 kB
          Harish Butani

        Issue Links

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            rhbutani Harish Butani Assign to me
            mmokhtar Mostafa Mokhtar
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment