This is an automated email from the ASF dual-hosted git repository.
tkhurana pushed a commit to branch 5.2
in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/5.2 by this push:
new 5b87b3376e PHOENIX-7690 Add a config to enable using bloom filters for
multi-key point lookups
5b87b3376e is described below
commit 5b87b3376e6eb08a5092b97c35bac8afc04b40c8
Author: tkhurana <[email protected]>
AuthorDate: Wed Aug 20 08:16:04 2025 -0700
PHOENIX-7690 Add a config to enable using bloom filters for multi-key point
lookups
---
.../org/apache/phoenix/query/QueryServices.java | 2 ++
.../phoenix/coprocessor/PagingRegionScanner.java | 16 ++++++++++++++-
.../java/org/apache/phoenix/end2end/InListIT.java | 2 ++
.../org/apache/phoenix/end2end/ServerPagingIT.java | 24 ++++++++++++++++++++++
.../phoenix/monitoring/CountRowsScannedIT.java | 11 +++++++++-
5 files changed, 53 insertions(+), 2 deletions(-)
diff --git
a/phoenix-core-client/src/main/java/org/apache/phoenix/query/QueryServices.java
b/phoenix-core-client/src/main/java/org/apache/phoenix/query/QueryServices.java
index 8174562471..5ed24f77a6 100644
---
a/phoenix-core-client/src/main/java/org/apache/phoenix/query/QueryServices.java
+++
b/phoenix-core-client/src/main/java/org/apache/phoenix/query/QueryServices.java
@@ -573,6 +573,8 @@ public interface QueryServices extends SQLCloseable {
String CQSI_THREAD_POOL_METRICS_ENABLED =
"phoenix.cqsi.thread.pool.metrics.enabled";
+ String USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP =
"phoenix.bloomfilter.multikey.pointlookup";
+
/**
* Get executor service used for parallel scans
*/
diff --git
a/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/PagingRegionScanner.java
b/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/PagingRegionScanner.java
index 462f4420fe..e3f1d6afea 100644
---
a/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/PagingRegionScanner.java
+++
b/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/PagingRegionScanner.java
@@ -17,6 +17,8 @@
*/
package org.apache.phoenix.coprocessor;
+import static
org.apache.phoenix.query.QueryServices.USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP;
+
import java.io.IOException;
import java.util.List;
import org.apache.hadoop.hbase.Cell;
@@ -37,6 +39,8 @@ import org.apache.phoenix.util.ScanUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import
org.apache.phoenix.thirdparty.com.google.common.annotations.VisibleForTesting;
+
/**
* PagingRegionScanner works with PagingFilter to make sure that the time
between two rows returned
* by the HBase region scanner should not exceed the configured page size in
ms (on PagingFilter).
@@ -185,13 +189,23 @@ public class PagingRegionScanner extends
BaseRegionScanner {
pagingFilter = ScanUtil.getPhoenixPagingFilter(scan);
}
+ @VisibleForTesting
+ public static boolean useBloomFilterForMultiKeyPointLookup(TableDescriptor
tableDescriptor) {
+ String useBloomFilter =
tableDescriptor.getValue(USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP);
+ return Boolean.valueOf(useBloomFilter);
+ }
+
+ private boolean useBloomFilterForMultiKeyPointLookup() {
+ return useBloomFilterForMultiKeyPointLookup(region.getTableDescriptor());
+ }
+
void init() throws IOException {
if (initialized) {
return;
}
TableDescriptor tableDescriptor = region.getTableDescriptor();
BloomType bloomFilterType =
tableDescriptor.getColumnFamilies()[0].getBloomFilterType();
- if (bloomFilterType == BloomType.ROW) {
+ if (bloomFilterType == BloomType.ROW &&
useBloomFilterForMultiKeyPointLookup()) {
// Check if the scan is a multi-point-lookup scan if so remove it from
the scan
SkipScanFilter skipScanFilter = ScanUtil.removeSkipScanFilter(scan);
if (skipScanFilter != null) {
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/InListIT.java
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/InListIT.java
index e3f8885d2e..8d16b3a1c2 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/InListIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/InListIT.java
@@ -18,6 +18,7 @@
package org.apache.phoenix.end2end;
import static java.util.Collections.singletonList;
+import static
org.apache.phoenix.query.QueryServices.USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP;
import static org.apache.phoenix.util.PhoenixRuntime.TENANT_ID_ATTRIB;
import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
import static org.junit.Assert.assertEquals;
@@ -313,6 +314,7 @@ public class InListIT extends ParallelStatsDisabledIT {
ddlBuilder.append(", ");
}
ddlBuilder.append("BLOOMFILTER='ROW'");
+ ddlBuilder.append(String.format(", \"%s\" = true",
USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP));
}
return ddlBuilder.toString();
}
diff --git
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ServerPagingIT.java
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ServerPagingIT.java
index a3df397a0f..dfd72201e3 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ServerPagingIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ServerPagingIT.java
@@ -20,6 +20,7 @@ package org.apache.phoenix.end2end;
import static
org.apache.phoenix.end2end.index.GlobalIndexCheckerIT.assertExplainPlan;
import static
org.apache.phoenix.end2end.index.GlobalIndexCheckerIT.assertExplainPlanWithLimit;
import static
org.apache.phoenix.monitoring.GlobalClientMetrics.GLOBAL_PAGED_ROWS_COUNTER;
+import static
org.apache.phoenix.query.QueryServices.USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP;
import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -34,7 +35,11 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
import java.util.Properties;
+import org.apache.hadoop.hbase.client.TableDescriptor;
+import org.apache.hadoop.hbase.regionserver.BloomType;
import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.phoenix.coprocessor.PagingRegionScanner;
+import org.apache.phoenix.jdbc.PhoenixConnection;
import org.apache.phoenix.jdbc.PhoenixResultSet;
import org.apache.phoenix.jdbc.PhoenixStatement;
import org.apache.phoenix.monitoring.MetricType;
@@ -451,6 +456,25 @@ public class ServerPagingIT extends
ParallelStatsDisabledIT {
Assert.assertEquals(101, numRpc);
}
+ @Test
+ public void testBloomFilterDefaults() throws Exception {
+ String dataTableName = generateUniqueName();
+ populateTable(dataTableName);
+ try (Connection conn = DriverManager.getConnection(getUrl())) {
+ PhoenixConnection pconn = conn.unwrap(PhoenixConnection.class);
+ TableDescriptor td =
+
pconn.getQueryServices().getTableDescriptor(Bytes.toBytes(dataTableName));
+ BloomType bloomType = td.getColumnFamilies()[0].getBloomFilterType();
+ assertEquals(BloomType.ROW, bloomType);
+
assertFalse(PagingRegionScanner.useBloomFilterForMultiKeyPointLookup(td));
+ String ddl = String.format("alter table %s set \"%s\" = true",
dataTableName,
+ USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP);
+ conn.createStatement().execute(ddl);
+ td =
pconn.getQueryServices().getTableDescriptor(Bytes.toBytes(dataTableName));
+ assertTrue(PagingRegionScanner.useBloomFilterForMultiKeyPointLookup(td));
+ }
+ }
+
private void populateTable(String tableName) throws Exception {
Connection conn = DriverManager.getConnection(getUrl());
conn.createStatement()
diff --git
a/phoenix-core/src/it/java/org/apache/phoenix/monitoring/CountRowsScannedIT.java
b/phoenix-core/src/it/java/org/apache/phoenix/monitoring/CountRowsScannedIT.java
index 89bbc62b61..d8ca7e0c79 100644
---
a/phoenix-core/src/it/java/org/apache/phoenix/monitoring/CountRowsScannedIT.java
+++
b/phoenix-core/src/it/java/org/apache/phoenix/monitoring/CountRowsScannedIT.java
@@ -17,6 +17,7 @@
*/
package org.apache.phoenix.monitoring;
+import static
org.apache.phoenix.query.QueryServices.USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP;
import static org.junit.Assert.assertEquals;
import java.sql.Connection;
@@ -122,7 +123,15 @@ public class CountRowsScannedIT extends BaseTest {
// skip scan
long count12 =
countRowsScannedFromSql(stmt, "SELECT A,Z FROM " + tableName + " WHERE A
in (20, 45, 68, 3)");
- assertEquals(4, count12);
+ assertEquals(7, count12); // 2n - 1 where n is number of keys
+
+ // Query again but this time enable bloom filters for multi key point
lookup
+ String ddl = String.format("alter table %s set \"%s\" = true", tableName,
+ USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP);
+ conn.createStatement().execute(ddl);
+ long count13 =
+ countRowsScannedFromSql(stmt, "SELECT A,Z FROM " + tableName + " WHERE A
in (20, 45, 68, 3)");
+ assertEquals(4, count13);
}
@Test