You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by st...@apache.org on 2023/07/19 10:42:42 UTC
[phoenix] branch 5.1 updated: PHOENIX-6986 Add property to disable server merges for hinted uncovered indexes
This is an automated email from the ASF dual-hosted git repository.
stoty pushed a commit to branch 5.1
in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/5.1 by this push:
new 2d86b6f1ad PHOENIX-6986 Add property to disable server merges for hinted uncovered indexes
2d86b6f1ad is described below
commit 2d86b6f1ad75ed7028a3a42ad4ab9a11979c6e1d
Author: Abhishek Kothalikar <ka...@cloudera.com>
AuthorDate: Fri Jul 14 12:39:50 2023 +0530
PHOENIX-6986 Add property to disable server merges for hinted uncovered indexes
---
.../apache/phoenix/optimize/QueryOptimizer.java | 7 +++-
.../org/apache/phoenix/query/QueryServices.java | 5 +++
.../apache/phoenix/query/QueryServicesOptions.java | 7 +++-
.../apache/phoenix/compile/QueryCompilerTest.java | 38 ++++++++++++++++++++++
4 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/optimize/QueryOptimizer.java b/phoenix-core/src/main/java/org/apache/phoenix/optimize/QueryOptimizer.java
index 68d70e0cb3..0b2028ed56 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/optimize/QueryOptimizer.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/optimize/QueryOptimizer.java
@@ -338,10 +338,15 @@ public class QueryOptimizer {
Map<TableRef, QueryPlan> dataPlans = Collections.singletonMap(indexTableRef, dataPlan);
PTable indexTable = indexTableRef.getTable();
PIndexState indexState = indexTable.getIndexState();
+ boolean isServerMergeForUncoveredIndexEnabled = statement.getConnection()
+ .getQueryServices().getProps().getBoolean(
+ QueryServices.SERVER_MERGE_FOR_UNCOVERED_INDEX,
+ QueryServicesOptions.DEFAULT_SERVER_MERGE_FOR_UNCOVERED_INDEX);
if (indexState == PIndexState.ACTIVE || indexState == PIndexState.PENDING_ACTIVE
|| (indexState == PIndexState.PENDING_DISABLE && isUnderPendingDisableThreshold(indexTableRef.getCurrentTime(), indexTable.getIndexDisableTimestamp()))) {
try {
- if (select.getHint().hasHint(HintNode.Hint.NO_INDEX_SERVER_MERGE)) {
+ if (!isServerMergeForUncoveredIndexEnabled
+ || select.getHint().hasHint(HintNode.Hint.NO_INDEX_SERVER_MERGE)) {
String schemaNameStr = index.getSchemaName() == null ? null
: index.getSchemaName().getString();
String tableNameStr = index.getTableName() == null ? null
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 d875ac223a..59c5c37530 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
@@ -392,6 +392,11 @@ public interface QueryServices extends SQLCloseable {
String MAX_REGION_LOCATIONS_SIZE_EXPLAIN_PLAN =
"phoenix.max.region.locations.size.explain.plan";
+ /**
+ * Parameter to disable the server merges for hinted uncovered indexes
+ */
+ String SERVER_MERGE_FOR_UNCOVERED_INDEX = "phoenix.query.global.server.merge.enable";
+
/**
* Get executor service used for parallel scans
*/
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 7d49c760e1..f91425e825 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
@@ -78,6 +78,7 @@ import static org.apache.phoenix.query.QueryServices.SCAN_CACHE_SIZE_ATTRIB;
import static org.apache.phoenix.query.QueryServices.SCAN_RESULT_CHUNK_SIZE;
import static org.apache.phoenix.query.QueryServices.SEQUENCE_CACHE_SIZE_ATTRIB;
import static org.apache.phoenix.query.QueryServices.SEQUENCE_SALT_BUCKETS_ATTRIB;
+import static org.apache.phoenix.query.QueryServices.SERVER_MERGE_FOR_UNCOVERED_INDEX;
import static org.apache.phoenix.query.QueryServices.SERVER_SPOOL_THRESHOLD_BYTES_ATTRIB;
import static org.apache.phoenix.query.QueryServices.SKIP_SYSTEM_TABLES_EXISTENCE_CHECK;
import static org.apache.phoenix.query.QueryServices.SPOOL_DIRECTORY;
@@ -382,6 +383,7 @@ public class QueryServicesOptions {
public static final boolean DEFAULT_SKIP_SYSTEM_TABLES_EXISTENCE_CHECK = false;
public static final boolean DEFAULT_APPLY_TIME_ZONE_DISPLACMENT = false;
public static final int DEFAULT_MAX_REGION_LOCATIONS_SIZE_EXPLAIN_PLAN = 5;
+ public static final boolean DEFAULT_SERVER_MERGE_FOR_UNCOVERED_INDEX = true;
private final Configuration config;
@@ -472,7 +474,10 @@ public class QueryServicesOptions {
.setIfUnset(SKIP_SYSTEM_TABLES_EXISTENCE_CHECK,
DEFAULT_SKIP_SYSTEM_TABLES_EXISTENCE_CHECK)
.setIfUnset(MAX_REGION_LOCATIONS_SIZE_EXPLAIN_PLAN,
- DEFAULT_MAX_REGION_LOCATIONS_SIZE_EXPLAIN_PLAN);
+ DEFAULT_MAX_REGION_LOCATIONS_SIZE_EXPLAIN_PLAN)
+ .setIfUnset(SERVER_MERGE_FOR_UNCOVERED_INDEX,
+ DEFAULT_SERVER_MERGE_FOR_UNCOVERED_INDEX);
+
// HBase sets this to 1, so we reset it to something more appropriate.
// Hopefully HBase will change this, because we can't know if a user set
// it to 1, so we'll change it.
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
index 29dc819270..8f5f7e3304 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
@@ -7058,4 +7058,42 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
}
}
+ @Test
+ public void testUncoveredPhoenix6986() throws Exception {
+ Properties props = new Properties();
+ props.setProperty(QueryServices.SERVER_MERGE_FOR_UNCOVERED_INDEX,
+ Boolean.toString(false));
+ try (Connection conn = DriverManager.getConnection(getUrl(), props);
+ Statement stmt = conn.createStatement()) {
+ stmt.execute("CREATE TABLE TAB_PHOENIX_6986 (\n" + "K1 CHAR(6) NOT NULL,\n"
+ + "K2 VARCHAR(22) NOT NULL,\n"
+ + "K3 CHAR(2) NOT NULL,\n"
+ + "K4 VARCHAR(36) NOT NULL,\n"
+ + "V1 TIMESTAMP,\n"
+ + "V2 TIMESTAMP,\n"
+ + "CONSTRAINT PK_PHOENIX_6986 PRIMARY KEY (K1,K2,K3,K4))");
+
+ stmt.execute("CREATE INDEX IDX_PHOENIX_6986 ON TAB_PHOENIX_6986(K2, K1, K3, K4)");
+ String query =
+ "SELECT /*+ INDEX(TAB_PHOENIX_6986 IDX_PHOENIX_6986) */ * "
+ + "FROM TAB_PHOENIX_6986 "
+ + "WHERE K2 = 'XXX' AND "
+ + "V2 >= TIMESTAMP '2023-05-31 23:59:59.000' AND "
+ + "V1 <= TIMESTAMP '2023-04-01 00:00:00.000' "
+ + "ORDER BY V2 asc";
+ ResultSet rs = stmt.executeQuery("EXPLAIN " + query);
+ String explainPlan = QueryUtil.getExplainPlan(rs);
+ assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER TAB_PHOENIX_6986\n"
+ + " SERVER FILTER BY (V2 >= TIMESTAMP '2023-05-31 23:59:59.000'"
+ + " AND V1 <= TIMESTAMP '2023-04-01 00:00:00.000')\n"
+ + " SERVER SORTED BY [TAB_PHOENIX_6986.V2]\n"
+ + "CLIENT MERGE SORT\n"
+ + " SKIP-SCAN-JOIN TABLE 0\n"
+ + " CLIENT PARALLEL 1-WAY RANGE SCAN OVER IDX_PHOENIX_6986 ['XXX']\n"
+ + " SERVER FILTER BY FIRST KEY ONLY\n"
+ + " DYNAMIC SERVER FILTER BY (\"TAB_PHOENIX_6986.K1\", \"TAB_PHOENIX_6986.K2\", \"TAB_PHOENIX_6986.K3\", \"TAB_PHOENIX_6986.K4\")"
+ + " IN (($2.$4, $2.$5, $2.$6, $2.$7))",
+ explainPlan);
+ }
+ }
}