Uploaded image for project: 'Calcite'
  1. Calcite
  2. CALCITE-4887

Filter subQuery remove not fully optimized

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 1.28.0
    • None
    • None

    Description

      for example:

      SELECT 
        count(1) 
      FROM 
        SSB.P_LINEORDER as P_LINEORDER 
        LEFT JOIN SSB.PART as PART ON P_LINEORDER.LO_PARTKEY = PART.P_PARTKEY 
        LEFT JOIN SSB.DATES as DATES ON P_LINEORDER.LO_ORDERDATE = DATES.D_DATEKEY 
        LEFT JOIN SSB.CUSTOMER as CUSTOMER ON P_LINEORDER.LO_CUSTKEY = CUSTOMER.C_CUSTKEY 
        LEFT JOIN SSB.SUPPLIER as SUPPLIER ON P_LINEORDER.LO_SUPPKEY = SUPPLIER.S_SUPPKEY 
      WHERE 
        P_LINEORDER.LO_ORDERDATE = '1992-01-01' 
        or (
          P_LINEORDER.LO_ORDERDATE in (
            select 
              D_DATEKEY 
            from 
              SSB.DATES 
            where 
              DATES.D_DATEKEY = '1992-01-01'
          )
        ) 
      LIMIT 
        500

       

      plan is

       

      LimitRel(ctx=[], fetch=[500])
          AggregateRel(group-set=[[]], groups=[null], EXPR$0=[COUNT()])
            ProjectRel(ctx=[])
              FilterRel(condition=[OR(=($5, 1992-01-01), CAST(AND(IS NOT NULL($65), <>($62, 0))):BOOLEAN)])
                JoinRel(condition=[=($5, $64)], joinType=[left])
                  JoinRel(condition=[true], joinType=[inner])
                    JoinRel(condition=[=($4, $55)], joinType=[left])
                      JoinRel(condition=[=($2, $47)], joinType=[left])
                        JoinRel(condition=[=($5, $30)], joinType=[left])
                          JoinRel(condition=[=($3, $21)], joinType=[left])
                            TableScan(table=[[SSB, P_LINEORDER]], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]])
                            TableScan(table=[[SSB, PART]], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8]])
                          TableScan(table=[[SSB, DATES]], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]])
                        TableScan(table=[[SSB, CUSTOMER]], fields=[[0, 1, 2, 3, 4, 5, 6, 7]])
                      TableScan(table=[[SSB, SUPPLIER]], fields=[[0, 1, 2, 3, 4, 5, 6]])
                    AggregateRel(group-set=[[]], groups=[null], c=[COUNT()], ck=[COUNT($0)])
                      ProjectRel(D_DATEKEY=[$0])
                        FilterRel(condition=[=($0, 1992-01-01)])
                          TableScan(table=[[SSB, DATES]], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]])
                  AggregateRel(group-set=[[0, 1]], groups=[null])
                    ProjectRel(D_DATEKEY=[$0], i=[true])
                      FilterRel(condition=[=($0, 1992-01-01)])
                        TableScan(table=[[SSB, DATES]], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]])

       

       

      But the optimal plan should be

       

      LimitRel(fetch=[500])
          AggregateRel(group-set=[[]], groups=[null], EXPR$0=[COUNT()])
            ProjectRel(ctx=[])
              FilterRel(condition=[=($5, 1992-01-01)])
                JoinRel(condition=[=($5, $62)], joinType=[inner])
                  JoinRel(condition=[=($4, $55)], joinType=[left])
                    JoinRel(condition=[=($2, $47)], joinType=[left])
                      JoinRel(condition=[=($5, $30)], joinType=[left])
                        JoinRel(condition=[=($3, $21)], joinType=[left])
                          TableScan(table=[[SSB, P_LINEORDER]], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]])
                          TableScan(table=[[SSB, PART]], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8]])
                        TableScan(table=[[SSB, DATES]], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]])
                      TableScan(table=[[SSB, CUSTOMER]], fields=[[0, 1, 2, 3, 4, 5, 6, 7]])
                    TableScan(table=[[SSB, SUPPLIER]], fields=[[0, 1, 2, 3, 4, 5, 6]])
                  AggregateRel(group-set=[[0]], groups=[null])
                    ProjectRel(D_DATEKEY=[$0])
                      FilterRel(condition=[=($0, 1992-01-01)])
                        TableScan(table=[[SSB, DATES]], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]])

       

       

       

      Attachments

        Issue Links

          Activity

            People

              bingfeng bingfeng.guo
              bingfeng bingfeng.guo
              Votes:
              0 Vote for this issue
              Watchers:
              6 Start watching this issue

              Dates

                Created:
                Updated:

                Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 2.5h
                  2.5h