@Override public ExplainPlan getExplainPlan() throws SQLException { return delegate.getExplainPlan(); }
@Override public List<String> getPreSteps(HashJoinPlan parent) throws SQLException { List<String> steps = Lists.newArrayList(); steps.add(" EXECUTE " + (expectSingleRow ? "SINGLE" : "MULTIPLE") + "-ROW SUBQUERY"); for (String step : plan.getExplainPlan().getPlanSteps()) { steps.add(" " + step); } return steps; }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> queryPlanSteps = queryPlan.getExplainPlan().getPlanSteps(); List<String> planSteps = Lists.newArrayListWithExpectedSize(queryPlanSteps.size()+1); planSteps.add("UPSERT SELECT"); planSteps.addAll(queryPlanSteps); return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> queryPlanSteps = bestPlan.getExplainPlan().getPlanSteps(); List<String> planSteps = Lists.newArrayListWithExpectedSize(queryPlanSteps.size()+1); planSteps.add("DELETE ROWS"); planSteps.addAll(queryPlanSteps); return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> queryPlanSteps = aggPlan.getExplainPlan().getPlanSteps(); List<String> planSteps = Lists.newArrayListWithExpectedSize(queryPlanSteps.size()+1); planSteps.add("DELETE ROWS"); planSteps.addAll(queryPlanSteps); return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> queryPlanSteps = aggPlan.getExplainPlan().getPlanSteps(); List<String> planSteps = Lists.newArrayListWithExpectedSize(queryPlanSteps.size()+1); planSteps.add("UPSERT ROWS"); planSteps.addAll(queryPlanSteps); return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> planSteps = Lists.newArrayList(delegate.getExplainPlan().getPlanSteps()); if (postFilter != null) { planSteps.add("CLIENT FILTER BY " + postFilter.toString()); } return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> planSteps = delegate.getExplainPlan().getPlanSteps(); planSteps.add("UNNEST"); return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> steps = Lists.newArrayList(); steps.add("SORT-MERGE-JOIN (" + type.toString().toUpperCase() + ") TABLES"); for (String step : lhsPlan.getExplainPlan().getPlanSteps()) { steps.add(" " + step); } steps.add("AND" + (rhsSchema.getFieldCount() == 0 ? " (SKIP MERGE)" : "")); for (String step : rhsPlan.getExplainPlan().getPlanSteps()) { steps.add(" " + step); } return new ExplainPlan(steps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> steps = Lists.newArrayList(); steps.add("NESTED-LOOP-JOIN (" + joinType.toString().toUpperCase() + ") TABLES"); for (String step : delegate.getExplainPlan().getPlanSteps()) { steps.add(" " + step); } steps.add("AND" + (rhsSchema.getFieldCount() == 0 ? " (SKIP MERGE)" : "")); for (String step : rhs.getExplainPlan().getPlanSteps()) { steps.add(" " + step); } return new ExplainPlan(steps); }
@Override public List<String> getPreSteps(HashJoinPlan parent) throws SQLException { List<String> steps = Lists.newArrayList(); boolean earlyEvaluation = parent.joinInfo.earlyEvaluation()[index]; boolean skipMerge = parent.joinInfo.getSchemas()[index].getFieldCount() == 0; if (hashExpressions != null) { steps.add(" PARALLEL " + parent.joinInfo.getJoinTypes()[index].toString().toUpperCase() + "-JOIN TABLE " + index + (earlyEvaluation ? "" : "(DELAYED EVALUATION)") + (skipMerge ? " (SKIP MERGE)" : "")); } else { steps.add(" SKIP-SCAN-JOIN TABLE " + index); } for (String step : plan.getExplainPlan().getPlanSteps()) { steps.add(" " + step); } return steps; }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> planSteps = Lists.newArrayList(delegate.getExplainPlan().getPlanSteps()); if (where != null) { planSteps.add("CLIENT FILTER BY " + where.toString()); } if (!orderBy.getOrderByExpressions().isEmpty()) { if (offset != null) { planSteps.add("CLIENT OFFSET " + offset); } planSteps.add("CLIENT" + (limit == null ? "" : " TOP " + limit + " ROW" + (limit == 1 ? "" : "S")) + " SORTED BY " + orderBy.getOrderByExpressions().toString()); } else { if (offset != null) { planSteps.add("CLIENT OFFSET " + offset); } if (limit != null) { planSteps.add("CLIENT " + limit + " ROW LIMIT"); } } if (context.getSequenceManager().getSequenceCount() > 0) { int nSequences = context.getSequenceManager().getSequenceCount(); planSteps.add("CLIENT RESERVE VALUES FROM " + nSequences + " SEQUENCE" + (nSequences == 1 ? "" : "S")); } return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> planSteps = Lists.newArrayList(delegate.getExplainPlan().getPlanSteps()); int count = subPlans.length; for (int i = 0; i < count; i++) { planSteps.addAll(subPlans[i].getPreSteps(this)); } for (int i = 0; i < count; i++) { planSteps.addAll(subPlans[i].getPostSteps(this)); } if (joinInfo != null && joinInfo.getPostJoinFilterExpression() != null) { planSteps.add(" AFTER-JOIN SERVER FILTER BY " + joinInfo.getPostJoinFilterExpression().toString()); } if (joinInfo != null && joinInfo.getLimit() != null) { planSteps.add(" JOIN-SCANNER " + joinInfo.getLimit() + " ROW LIMIT"); } return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> planSteps = Lists.newArrayList(delegate.getExplainPlan().getPlanSteps()); if (where != null) { planSteps.add("CLIENT FILTER BY " + where.toString());
@Test public void testSerialHint() throws Exception { // test AggregatePlan String query = "SELECT /*+ SERIAL */ COUNT(*) FROM atable"; assertTrue("Expected a SERIAL query", compileStatement(query).getExplainPlan().getPlanSteps().get(0).contains("SERIAL")); // test ScanPlan query = "SELECT /*+ SERIAL */ * FROM atable limit 10"; assertTrue("Expected a SERIAL query", compileStatement(query, Collections.emptyList(), 10).getExplainPlan().getPlanSteps().get(0).contains("SERIAL")); } }
@Override public Object run() throws Exception { try (Connection conn = getConnection(tenantId); Statement stmt = conn.createStatement()) { // Accessing only the 'data' from the table uses index since index tables are built on 'data' column String readTableSQL = "SELECT data FROM " + tableName; ResultSet rs = stmt.executeQuery(readTableSQL); assertNotNull(rs); int i = 0; String explainPlan = Joiner.on(" ").join(((PhoenixStatement) stmt).getQueryPlan().getExplainPlan().getPlanSteps()); assertTrue(explainPlan.contains("_IDX_")); rs = stmt.executeQuery(readTableSQL); if (tenantId != null) { rs.next(); assertEquals(((PhoenixConnection) conn).getTenantId().toString(), tenantId); // For tenant ID "o3", the value in table will be 3 assertEquals(Character.toString(tenantId.charAt(1)), rs.getString(1)); // Only 1 record is inserted per Tenant assertFalse(rs.next()); } else { while (rs.next()) { assertEquals(Integer.toString(i), rs.getString(1)); i++; } assertEquals(NUM_RECORDS, i); } } return null; } };
@Override public Object run() throws Exception { try (Connection conn = getConnection(tenantId); Statement stmt = conn.createStatement()) { // Accessing all the data from the table avoids the use of index String readTableSQL = "SELECT data, val FROM " + tableName; ResultSet rs = stmt.executeQuery(readTableSQL); assertNotNull(rs); int i = 0; String explainPlan = Joiner.on(" ").join(((PhoenixStatement)stmt).getQueryPlan().getExplainPlan().getPlanSteps()); rs = stmt.executeQuery(readTableSQL); if(tenantId != null) { rs.next(); assertFalse(explainPlan.contains("_IDX_")); assertEquals(((PhoenixConnection)conn).getTenantId().toString(), tenantId); // For tenant ID "o3", the value in table will be 3 assertEquals(Character.toString(tenantId.charAt(1)), rs.getString(1)); // Only 1 record is inserted per Tenant assertFalse(rs.next()); } else { while(rs.next()) { assertEquals(Integer.toString(i), rs.getString(1)); assertEquals(i, rs.getInt(2)); i++; } assertEquals(NUM_RECORDS, i); } } return null; } };
@Override public List<String> getPreSteps(HashJoinPlan parent) throws SQLException { List<String> steps = Lists.newArrayList(); steps.add(" EXECUTE " + (expectSingleRow ? "SINGLE" : "MULTIPLE") + "-ROW SUBQUERY"); for (String step : plan.getExplainPlan().getPlanSteps()) { steps.add(" " + step); } return steps; }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> queryPlanSteps = queryPlan.getExplainPlan().getPlanSteps(); List<String> planSteps = Lists.newArrayListWithExpectedSize(queryPlanSteps.size()+1); planSteps.add("UPSERT SELECT"); planSteps.addAll(queryPlanSteps); return new ExplainPlan(planSteps); }
@Override public ExplainPlan getExplainPlan() throws SQLException { List<String> planSteps = delegate.getExplainPlan().getPlanSteps(); planSteps.add("UNNEST"); return new ExplainPlan(planSteps); }