Repository: phoenix Updated Branches: refs/heads/4.2 33252b06d -> 95324b02e
PHOENIX-1533 Last key part not taken into child/parent optimization Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/95324b02 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/95324b02 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/95324b02 Branch: refs/heads/4.2 Commit: 95324b02ef8e2d87ca3f3270d3d5e4a914e7d74f Parents: 33252b0 Author: maryannxue <maryann...@apache.org> Authored: Tue Dec 16 13:37:36 2014 -0500 Committer: maryannxue <maryann...@apache.org> Committed: Tue Dec 16 13:37:36 2014 -0500 ---------------------------------------------------------------------- .../org/apache/phoenix/end2end/HashJoinIT.java | 66 ++++++++++++++++++++ .../apache/phoenix/compile/WhereOptimizer.java | 6 +- 2 files changed, 71 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/95324b02/phoenix-core/src/it/java/org/apache/phoenix/end2end/HashJoinIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/HashJoinIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/HashJoinIT.java index d4ec40d..853105f 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/HashJoinIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/HashJoinIT.java @@ -453,6 +453,18 @@ public class HashJoinIT extends BaseHBaseManagedTimeIT { " CLIENT PARALLEL 4-WAY FULL SCAN OVER TEMP_TABLE_COMPOSITE_PK\n" + " CLIENT MERGE SORT\n" + " DYNAMIC SERVER FILTER BY (COL0, COL1) IN ((RHS.COL1, RHS.COL2))", + /* + * testJoinWithKeyRangeOptimization() + * SELECT (*SKIP_SCAN_HASH_JOIN*) lhs.col0, lhs.col1, lhs.col2, rhs.col0, rhs.col1, rhs.col2 + * FROM TEMP_TABLE_COMPOSITE_PK lhs + * JOIN TEMP_TABLE_COMPOSITE_PK rhs ON lhs.col0 = rhs.col1 AND lhs.col2 = rhs.col3 - 1 AND lhs.col1 = rhs.col2 + */ + "CLIENT PARALLEL 4-WAY FULL SCAN OVER TEMP_TABLE_COMPOSITE_PK\n" + + "CLIENT MERGE SORT\n" + + " PARALLEL INNER-JOIN TABLE 0\n" + + " CLIENT PARALLEL 4-WAY FULL SCAN OVER TEMP_TABLE_COMPOSITE_PK\n" + + " CLIENT MERGE SORT\n" + + " DYNAMIC SERVER FILTER BY (COL0, COL1, COL2) IN ((RHS.COL1, RHS.COL2, TO_INTEGER((RHS.COL3 - 1))))", }}); testCases.add(new String[][] { { @@ -803,6 +815,18 @@ public class HashJoinIT extends BaseHBaseManagedTimeIT { " CLIENT PARALLEL 4-WAY FULL SCAN OVER TEMP_TABLE_COMPOSITE_PK\n" + " CLIENT MERGE SORT\n" + " DYNAMIC SERVER FILTER BY (COL0, COL1) IN ((RHS.COL1, RHS.COL2))", + /* + * testJoinWithKeyRangeOptimization() + * SELECT (*SKIP_SCAN_HASH_JOIN*) lhs.col0, lhs.col1, lhs.col2, rhs.col0, rhs.col1, rhs.col2 + * FROM TEMP_TABLE_COMPOSITE_PK lhs + * JOIN TEMP_TABLE_COMPOSITE_PK rhs ON lhs.col0 = rhs.col1 AND lhs.col2 = rhs.col3 - 1 AND lhs.col1 = rhs.col2 + */ + "CLIENT PARALLEL 4-WAY FULL SCAN OVER TEMP_TABLE_COMPOSITE_PK\n" + + "CLIENT MERGE SORT\n" + + " PARALLEL INNER-JOIN TABLE 0\n" + + " CLIENT PARALLEL 4-WAY FULL SCAN OVER TEMP_TABLE_COMPOSITE_PK\n" + + " CLIENT MERGE SORT\n" + + " DYNAMIC SERVER FILTER BY (COL0, COL1, COL2) IN ((RHS.COL1, RHS.COL2, TO_INTEGER((RHS.COL3 - 1))))", }}); testCases.add(new String[][] { { @@ -1176,6 +1200,18 @@ public class HashJoinIT extends BaseHBaseManagedTimeIT { " CLIENT PARALLEL 4-WAY FULL SCAN OVER TEMP_TABLE_COMPOSITE_PK\n" + " CLIENT MERGE SORT\n" + " DYNAMIC SERVER FILTER BY (COL0, COL1) IN ((RHS.COL1, RHS.COL2))", + /* + * testJoinWithKeyRangeOptimization() + * SELECT (*SKIP_SCAN_HASH_JOIN*) lhs.col0, lhs.col1, lhs.col2, rhs.col0, rhs.col1, rhs.col2 + * FROM TEMP_TABLE_COMPOSITE_PK lhs + * JOIN TEMP_TABLE_COMPOSITE_PK rhs ON lhs.col0 = rhs.col1 AND lhs.col2 = rhs.col3 - 1 AND lhs.col1 = rhs.col2 + */ + "CLIENT PARALLEL 4-WAY FULL SCAN OVER TEMP_TABLE_COMPOSITE_PK\n" + + "CLIENT MERGE SORT\n" + + " PARALLEL INNER-JOIN TABLE 0\n" + + " CLIENT PARALLEL 4-WAY FULL SCAN OVER TEMP_TABLE_COMPOSITE_PK\n" + + " CLIENT MERGE SORT\n" + + " DYNAMIC SERVER FILTER BY (COL0, COL1, COL2) IN ((RHS.COL1, RHS.COL2, TO_INTEGER((RHS.COL3 - 1))))", }}); return testCases; } @@ -3821,6 +3857,36 @@ public class HashJoinIT extends BaseHBaseManagedTimeIT { rs = conn.createStatement().executeQuery("EXPLAIN " + query); assertEquals(plans[23], QueryUtil.getExplainPlan(rs)); + + // All parts of PK + query = "SELECT /*+ SKIP_SCAN_HASH_JOIN*/ lhs.col0, lhs.col1, lhs.col2, lhs.col3, rhs.col0, rhs.col1, rhs.col2, rhs.col3 FROM " + + tempTableWithCompositePK + " lhs JOIN " + + tempTableWithCompositePK + " rhs ON lhs.col1 = rhs.col2 AND lhs.col2 = rhs.col3 - 1 AND lhs.col0 = rhs.col1"; + statement = conn.prepareStatement(query); + rs = statement.executeQuery(); + assertTrue(rs.next()); + assertEquals(rs.getInt(1), 2); + assertEquals(rs.getInt(2), 3); + assertEquals(rs.getInt(3), 4); + assertEquals(rs.getInt(4), 6); + assertEquals(rs.getInt(5), 1); + assertEquals(rs.getInt(6), 2); + assertEquals(rs.getInt(7), 3); + assertEquals(rs.getInt(8), 5); + assertTrue(rs.next()); + assertEquals(rs.getInt(1), 3); + assertEquals(rs.getInt(2), 4); + assertEquals(rs.getInt(3), 5); + assertEquals(rs.getInt(4), 7); + assertEquals(rs.getInt(5), 2); + assertEquals(rs.getInt(6), 3); + assertEquals(rs.getInt(7), 4); + assertEquals(rs.getInt(8), 6); + + assertFalse(rs.next()); + + rs = conn.createStatement().executeQuery("EXPLAIN " + query); + assertEquals(plans[24], QueryUtil.getExplainPlan(rs)); } finally { conn.close(); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/95324b02/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java index 9242506..58e0bee 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java @@ -340,9 +340,9 @@ public class WhereOptimizer { } if (minPkPos != Integer.MAX_VALUE) { candidateIndexes.add(i); + pkPositions.add(minPkPos); } } - pkPositions.add(minPkPos); } if (candidateIndexes.isEmpty()) @@ -378,6 +378,10 @@ public class WhereOptimizer { Expression secondRhs = count == 0 ? sampleValues.get(1).get(0) : new RowValueConstructorExpression(sampleValues.get(1).subList(0, count + 1), true); Expression testExpression = InListExpression.create(Lists.newArrayList(lhs, firstRhs, secondRhs), false, context.getTempPtr()); remaining = pushKeyExpressionsToScan(context, statement, testExpression); + if (context.getScanRanges().isPointLookup()) { + count++; + break; // found the best match + } int pkSpan = context.getScanRanges().getPkColumnSpan(); if (pkSpan <= maxPkSpan) { break;