PHOENIX-1418 Optionally display number of parallel chunks in explain plan
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/4ed86c0c Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/4ed86c0c Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/4ed86c0c Branch: refs/heads/4.0 Commit: 4ed86c0cc78f316256eb119fcc5f8ffe6ed97362 Parents: 7f7425e Author: James Taylor <jtay...@salesforce.com> Authored: Thu Nov 6 19:42:19 2014 -0800 Committer: James Taylor <jtay...@salesforce.com> Committed: Thu Nov 6 19:42:19 2014 -0800 ---------------------------------------------------------------------- .../org/apache/phoenix/end2end/StatsCollectorIT.java | 11 ++++++++--- .../org/apache/phoenix/iterate/ParallelIterators.java | 6 +++++- .../java/org/apache/phoenix/query/QueryServices.java | 1 + .../org/apache/phoenix/query/QueryServicesOptions.java | 7 +++++++ .../org/apache/phoenix/query/QueryServicesTestImpl.java | 2 ++ 5 files changed, 23 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/4ed86c0c/phoenix-core/src/it/java/org/apache/phoenix/end2end/StatsCollectorIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/StatsCollectorIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/StatsCollectorIT.java index e7aada6..faa54ea 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/StatsCollectorIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/StatsCollectorIT.java @@ -43,6 +43,7 @@ import org.apache.phoenix.query.ConnectionQueryServices; import org.apache.phoenix.query.KeyRange; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.util.PropertiesUtil; +import org.apache.phoenix.util.QueryUtil; import org.apache.phoenix.util.ReadOnlyProps; import org.apache.phoenix.util.TestUtil; import org.junit.BeforeClass; @@ -61,6 +62,7 @@ public class StatsCollectorIT extends BaseOwnClusterHBaseManagedTimeIT { Map<String,String> props = Maps.newHashMapWithExpectedSize(3); // Must update config before starting server props.put(QueryServices.STATS_GUIDEPOST_WIDTH_BYTES_ATTRIB, Long.toString(20)); + props.put(QueryServices.EXPLAIN_CHUNK_COUNT_ATTRIB, Boolean.TRUE.toString()); setUpTestDriver(new ReadOnlyProps(props.entrySet().iterator())); } @@ -298,7 +300,7 @@ public class StatsCollectorIT extends BaseOwnClusterHBaseManagedTimeIT { } while (nRegions == nRegionsNow && nTries < 10); // FIXME: I see the commit of the stats finishing before this with a lower timestamp that the scan timestamp, // yet without this sleep, the query finds the old data. Seems like an HBase bug and a potentially serious one. - Thread.sleep(2000); + Thread.sleep(3000); } finally { admin.close(); } @@ -320,15 +322,18 @@ public class StatsCollectorIT extends BaseOwnClusterHBaseManagedTimeIT { } conn.commit(); + ResultSet rs; TestUtil.analyzeTable(conn, STATS_TEST_TABLE_NAME); List<KeyRange>keyRanges = getAllSplits(conn, STATS_TEST_TABLE_NAME); assertEquals(nRows+1, keyRanges.size()); - + rs = conn.createStatement().executeQuery("EXPLAIN SELECT * FROM " + STATS_TEST_TABLE_NAME); + assertEquals("CLIENT " + (nRows+1) + "-CHUNK " + "PARALLEL 1-WAY FULL SCAN OVER " + STATS_TEST_TABLE_NAME, QueryUtil.getExplainPlan(rs)); + ConnectionQueryServices services = conn.unwrap(PhoenixConnection.class).getQueryServices(); List<HRegionLocation> regions = services.getAllTableRegions(STATS_TEST_TABLE_BYTES); assertEquals(1, regions.size()); - ResultSet rs = conn.createStatement().executeQuery("SELECT GUIDE_POSTS_COUNT, REGION_NAME FROM SYSTEM.STATS WHERE PHYSICAL_NAME='"+STATS_TEST_TABLE_NAME+"' AND REGION_NAME IS NOT NULL"); + rs = conn.createStatement().executeQuery("SELECT GUIDE_POSTS_COUNT, REGION_NAME FROM SYSTEM.STATS WHERE PHYSICAL_NAME='"+STATS_TEST_TABLE_NAME+"' AND REGION_NAME IS NOT NULL"); assertTrue(rs.next()); assertEquals(nRows, rs.getLong(1)); assertEquals(regions.get(0).getRegionInfo().getRegionNameAsString(), rs.getString(2)); http://git-wip-us.apache.org/repos/asf/phoenix/blob/4ed86c0c/phoenix-core/src/main/java/org/apache/phoenix/iterate/ParallelIterators.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/iterate/ParallelIterators.java b/phoenix-core/src/main/java/org/apache/phoenix/iterate/ParallelIterators.java index 00458f3..7905d34 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/ParallelIterators.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/ParallelIterators.java @@ -56,6 +56,7 @@ import org.apache.phoenix.query.ConnectionQueryServices; import org.apache.phoenix.query.KeyRange; import org.apache.phoenix.query.QueryConstants; import org.apache.phoenix.query.QueryServices; +import org.apache.phoenix.query.QueryServicesOptions; import org.apache.phoenix.schema.MetaDataClient; import org.apache.phoenix.schema.PColumnFamily; import org.apache.phoenix.schema.PTable; @@ -654,8 +655,11 @@ public class ParallelIterators extends ExplainTable implements ResultIterators { @Override public void explain(List<String> planSteps) { + boolean displayChunkCount = context.getConnection().getQueryServices().getProps().getBoolean( + QueryServices.EXPLAIN_CHUNK_COUNT_ATTRIB, + QueryServicesOptions.DEFAULT_EXPLAIN_CHUNK_COUNT); StringBuilder buf = new StringBuilder(); - buf.append("CLIENT PARALLEL " + size() + "-WAY "); + buf.append("CLIENT " + (displayChunkCount ? (this.splits.size() + "-CHUNK ") : "") + "PARALLEL " + size() + "-WAY "); explain(buf.toString(),planSteps); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/4ed86c0c/phoenix-core/src/main/java/org/apache/phoenix/query/QueryServices.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/query/QueryServices.java b/phoenix-core/src/main/java/org/apache/phoenix/query/QueryServices.java index 414ed57..b074fb4 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/query/QueryServices.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/query/QueryServices.java @@ -140,6 +140,7 @@ public interface QueryServices extends SQLCloseable { public static final String SEQUENCE_SALT_BUCKETS_ATTRIB = "phoenix.sequence.saltBuckets"; public static final String COPROCESSOR_PRIORITY_ATTRIB = "phoenix.coprocessor.priority"; + public static final String EXPLAIN_CHUNK_COUNT_ATTRIB = "phoenix.explain.displayChunkCount"; /** * Get executor service used for parallel scans http://git-wip-us.apache.org/repos/asf/phoenix/blob/4ed86c0c/phoenix-core/src/main/java/org/apache/phoenix/query/QueryServicesOptions.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/query/QueryServicesOptions.java b/phoenix-core/src/main/java/org/apache/phoenix/query/QueryServicesOptions.java index 8491783..4894b18 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/query/QueryServicesOptions.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/query/QueryServicesOptions.java @@ -21,6 +21,7 @@ import static org.apache.phoenix.query.QueryServices.CALL_QUEUE_PRODUCER_ATTRIB_ import static org.apache.phoenix.query.QueryServices.CALL_QUEUE_ROUND_ROBIN_ATTRIB; import static org.apache.phoenix.query.QueryServices.DATE_FORMAT_ATTRIB; import static org.apache.phoenix.query.QueryServices.DROP_METADATA_ATTRIB; +import static org.apache.phoenix.query.QueryServices.EXPLAIN_CHUNK_COUNT_ATTRIB; import static org.apache.phoenix.query.QueryServices.GROUPBY_MAX_CACHE_SIZE_ATTRIB; import static org.apache.phoenix.query.QueryServices.GROUPBY_SPILLABLE_ATTRIB; import static org.apache.phoenix.query.QueryServices.GROUPBY_SPILL_FILES_ATTRIB; @@ -161,6 +162,7 @@ public class QueryServicesOptions { * Default value for coprocessor priority is between SYSTEM and USER priority. */ public static final int DEFAULT_COPROCESSOR_PRIORITY = Coprocessor.PRIORITY_SYSTEM/2 + Coprocessor.PRIORITY_USER/2; // Divide individually to prevent any overflow + public static final boolean DEFAULT_EXPLAIN_CHUNK_COUNT = true; private final Configuration config; @@ -457,4 +459,9 @@ public class QueryServicesOptions { return this; } + public QueryServicesOptions setExplainChunkCount(boolean showChunkCount) { + config.setBoolean(EXPLAIN_CHUNK_COUNT_ATTRIB, showChunkCount); + return this; + } + } http://git-wip-us.apache.org/repos/asf/phoenix/blob/4ed86c0c/phoenix-core/src/test/java/org/apache/phoenix/query/QueryServicesTestImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/query/QueryServicesTestImpl.java b/phoenix-core/src/test/java/org/apache/phoenix/query/QueryServicesTestImpl.java index 2af2666..c1b7f99 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/query/QueryServicesTestImpl.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/query/QueryServicesTestImpl.java @@ -52,6 +52,7 @@ public final class QueryServicesTestImpl extends BaseQueryServicesImpl { public static final long DEFAULT_MAX_SERVER_METADATA_CACHE_SIZE = 1024L*1024L*4L; // 4 Mb public static final long DEFAULT_MAX_CLIENT_METADATA_CACHE_SIZE = 1024L*1024L*2L; // 2 Mb public static final int DEFAULT_MIN_STATS_UPDATE_FREQ_MS = 0; + public static final boolean DEFAULT_EXPLAIN_CHUNK_COUNT = false; // TODO: update explain plans in test and set to true /** * Set number of salt buckets lower for sequence table during testing, as a high @@ -66,6 +67,7 @@ public final class QueryServicesTestImpl extends BaseQueryServicesImpl { private static QueryServicesOptions getDefaultServicesOptions() { return withDefaults() + .setExplainChunkCount(DEFAULT_EXPLAIN_CHUNK_COUNT) .setSequenceSaltBuckets(DEFAULT_SEQUENCE_TABLE_SALT_BUCKETS) .setMinStatsUpdateFrequencyMs(DEFAULT_MIN_STATS_UPDATE_FREQ_MS) .setThreadPoolSize(DEFAULT_THREAD_POOL_SIZE)