Bloom filter indexing
This topic describes how to create and modify bloom filter indexes, along with how they works.
A bloom filter index is a space-efficiency data structure that is used to detect the possible presence of filtered data in data files of a table. If the bloom filter index detects that the data to be filtered are not in a certain data file, CelerData skips scanning the data file. Bloom filter indexes can reduce response time when the column (such as ID) has a relatively high cardinality.
If a query hits a sort key column, CelerData efficiently returns the query result by using the prefix index. However, the prefix index entry for a data block cannot exceed 36 bytes in length. If you want to improve the query performance on a column, which is not used as a sort key and has a relatively high cardinality, you can create a bloom filter index for the column.
How it works
For example, you create a bloom filter index on a column1
of a given table table1
and run a query such as Select xxx from table1 where column1 = something;
. Then the following situations happen when CelerData scans the data files of table1
.
- If the bloom filter index detects that a data file does not contain the data to be filtered, CelerData skips the data file to improve query performance.
- If the bloom filter index detects that a data file may contain the data to be filtered, CelerData reads the data file to check whether the data exists. Note that the bloom filter can tell you for sure if a value is not present, but it cannot say for sure that a value is present, only that it may be present. Using a bloom filter index to determine whether a value is present may give false positives, which means that a bloom filter index detects that a data file contains the data to be filtered, but the data file does not actually contain the data.
Usage notes
- You can create bloom filter indexes for all columns of a table that uses the Duplicate Key table or Primary Key table. For a table that uses the Aggregate table or Unique Key table, you can only create bloom filter indexes for key columns.
- The columns of the TINYINT, FLOAT, DOUBLE, and DECIMAL types do not support creating bloom filter indexes.
- Bloom filter indexes can only improve the performance of queries that contain the
in
and=
operators, such asSelect xxx from table where x in {}
andSelect xxx from table where column = xxx
. - You can check whether a query uses bitmap indexes by viewing the
BloomFilterFilterRows
field of the query's profile.
Create bloom filter indexes
You can create a bloom filter index for a column when you create a table by specifying the bloom_filter_columns
parameter in PROPERTIES
. For example, create bloom filter indexes for the k1
and k2
columns in table1
.
CREATE TABLE table1
(
k1 BIGINT,
k2 LARGEINT,
v1 VARCHAR(2048) REPLACE,
v2 SMALLINT DEFAULT "10"
)
ENGINE = olap
PRIMARY KEY(k1, k2)
DISTRIBUTED BY HASH (k1, k2) BUCKETS 10
PROPERTIES("bloom_filter_columns" = "k1,k2");
You can create bloom filter indexes for multiple columns at a time by specifying these column names. Note that you need to separate these column names with commas (,
). For other parameter descriptions of the CREATE TABLE statement, see CREATE TABLE.
Display bloom filter indexes
For example, the following statement displays bloom filter indexes of table1
. For the output description, see SHOW CREATE TABLE.
SHOW CREATE TABLE table1;
Modify bloom filter indexes
You can add, reduce, and delete bloom filter indexes by using the ALTER TABLE statement.
-
The following statement adds a bloom filter index on the
v1
column.ALTER TABLE table1 SET ("bloom_filter_columns" = "k1,k2,v1");
-
The following statement reduces the bloom filter index on the
k2
column.ALTER TABLE table1 SET ("bloom_filter_columns" = "k1");
-
The following statement deletes all bloom filter indexes of
table1
.ALTER TABLE table1 SET ("bloom_filter_columns" = "");