Uploaded image for project: 'Phoenix'
  1. Phoenix
  2. PHOENIX-5109

Allow local indexes to work for queries with uncovered columns.

Attach filesAttach ScreenshotVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 4.14.1
    • 4.15.0, 5.1.0
    • None
    • None

    Description

      This change allows local indexes to be used for a wide set of queries where not all columns are covered.
      See scenarios in the test case attached with the patch.

      This is important for various reasons:

      1. Unlike global indexes, local indexes can support a wide range case where the queries are not covered.
      2. Indexes that cover only the indexed columns are much friendlier to schema changes. (changes to any extra included column cause a need to rebuild these indexes)
      3. A lot of storage is saved. The same is true for read and write IO.

      (Of course uncovered columns have disadvantages too, Phoenix needs to reassemble the complete row in those cases.)

      Was:

      Example:
      create table test (pk integer primary key, v1 float, v2 float, v3 integer);
      create local index l1 on test(v1);
      select /*+ INDEX(test l1) */ * from test where v2 = 1;

      0: jdbc:phoenix:localhost> select /*+ INDEX(test l1) */ * from test where v2 = 1;
      Error: ERROR 504 (42703): Undefined column. columnName=TEST.V2 (state=42703,code=504)
      org.apache.phoenix.schema.ColumnNotFoundException: ERROR 504 (42703): Undefined column. columnName=TEST.V2
      	at org.apache.phoenix.compile.WhereCompiler$WhereExpressionCompiler.resolveColumn(WhereCompiler.java:202)
      	at org.apache.phoenix.compile.WhereCompiler$WhereExpressionCompiler.visit(WhereCompiler.java:177)
      	at org.apache.phoenix.compile.WhereCompiler$WhereExpressionCompiler.visit(WhereCompiler.java:164)
      	at org.apache.phoenix.parse.ColumnParseNode.accept(ColumnParseNode.java:56)
      	at org.apache.phoenix.parse.CompoundParseNode.acceptChildren(CompoundParseNode.java:64)
      	at org.apache.phoenix.parse.CastParseNode.accept(CastParseNode.java:60)
      	at org.apache.phoenix.parse.CompoundParseNode.acceptChildren(CompoundParseNode.java:64)
      	at org.apache.phoenix.parse.ComparisonParseNode.accept(ComparisonParseNode.java:45)
      	at org.apache.phoenix.compile.WhereCompiler.compile(WhereCompiler.java:138)
      	at org.apache.phoenix.compile.WhereCompiler.compile(WhereCompiler.java:108)
      	at org.apache.phoenix.compile.QueryCompiler.compileSingleFlatQuery(QueryCompiler.java:559)
      	at org.apache.phoenix.compile.QueryCompiler.compileSingleQuery(QueryCompiler.java:510)
      	at org.apache.phoenix.compile.QueryCompiler.compileSelect(QueryCompiler.java:195)
      	at org.apache.phoenix.compile.QueryCompiler.compile(QueryCompiler.java:155)
      	at org.apache.phoenix.compile.QueryCompiler.compileSubquery(QueryCompiler.java:499)
      	at org.apache.phoenix.compile.QueryCompiler.compileJoinQuery(QueryCompiler.java:221)
      	at org.apache.phoenix.compile.QueryCompiler.compileJoinQuery(QueryCompiler.java:295)
      	at org.apache.phoenix.compile.QueryCompiler.compileJoinQuery(QueryCompiler.java:230)
      	at org.apache.phoenix.compile.QueryCompiler.compileSelect(QueryCompiler.java:193)
      	at org.apache.phoenix.compile.QueryCompiler.compile(QueryCompiler.java:155)
      	at org.apache.phoenix.optimize.QueryOptimizer.addPlan(QueryOptimizer.java:399)
      	at org.apache.phoenix.optimize.QueryOptimizer.getHintedQueryPlan(QueryOptimizer.java:279)
      	at org.apache.phoenix.optimize.QueryOptimizer.getApplicablePlansForSingleFlatQuery(QueryOptimizer.java:220)
      	at org.apache.phoenix.optimize.QueryOptimizer.getApplicablePlans(QueryOptimizer.java:133)
      	at org.apache.phoenix.optimize.QueryOptimizer.optimize(QueryOptimizer.java:111)
      	at org.apache.phoenix.optimize.QueryOptimizer.optimize(QueryOptimizer.java:97)
      	at org.apache.phoenix.jdbc.PhoenixStatement$1.call(PhoenixStatement.java:309)
      	at org.apache.phoenix.jdbc.PhoenixStatement$1.call(PhoenixStatement.java:291)
      	at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
      	at org.apache.phoenix.jdbc.PhoenixStatement.executeQuery(PhoenixStatement.java:290)
      	at org.apache.phoenix.jdbc.PhoenixStatement.executeQuery(PhoenixStatement.java:283)
      	at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1830)
      	at sqlline.Commands.execute(Commands.java:822)
      	at sqlline.Commands.sql(Commands.java:732)
      	at sqlline.SqlLine.dispatch(SqlLine.java:813)
      	at sqlline.SqlLine.begin(SqlLine.java:686)
      	at sqlline.SqlLine.start(SqlLine.java:398)
      	at sqlline.SqlLine.main(SqlLine.java:291)
      

      Attachments

        1. 5109-addendum2.txt
          5 kB
          Lars Hofhansl
        2. 5109-addendum.txt
          8 kB
          Lars Hofhansl
        3. 5109-v4-master.txt
          11 kB
          Lars Hofhansl
        4. 5109-v3.txt
          10 kB
          Lars Hofhansl
        5. 5109-v2.txt
          4 kB
          Lars Hofhansl
        6. 5109-v1.txt
          7 kB
          Lars Hofhansl

        Issue Links

        Activity

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

          People

            larsh Lars Hofhansl
            larsh Lars Hofhansl
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment