ブルームフィルターインデックス
このトピックでは、ブルームフィルターインデックスの作成と変更方法、およびその動作について説明します。
ブルームフィルターインデックスは、テーブルのデータファイル内のフィルタリングされたデータの存在の可能性を検出するために使用される、スペース効率の良いデータ構造です。ブルームフィルターインデックスがフィルタリングされるデータが特定のデータファイルに存在しないことを検出した場合、StarRocks はそのデータファイルのスキャンをスキップします。ブルームフィルターインデックスは、列(例えば ID)のカーディナリティが比較的高い場合に応答時間を短縮できます。
クエリがソートキー列にヒットした場合、StarRocks は プレフィックスインデックス を使用してクエリ結果を効率的に返します。ただし、データブロックのプレフィックスインデックスエントリは、長さが36バイトを超えることはできません。ソートキーとして使用されておらず、カーディナリティが比較的高い列のクエリパフォーマンスを向上させたい場合、その列にブルームフィルターインデックスを作成できます。
動作の仕組み
例えば、特定のテーブル table1
の column1
にブルームフィルターインデックスを作成し、Select xxx from table1 where column1 = something;
のようなクエリを実行すると、StarRocks が table1
のデータファイルをスキャンする際に次の状況が発生します。
- ブルームフィルターインデックスが、フィルタリングされるデータを含まないデータファイルを検出した場合、StarRocks はそのデータファイルをスキップしてクエリパフォーマンスを向上させます。
- ブルームフィルターインデックスが、フィルタリングされるデータを含む可能性があるデータファイルを検出した場合、StarRocks はデータが存在するかどうかを確認するためにデータファイルを読み込みます。ブルームフィルターは、値が存在しないことを確実に伝えることができますが、値が存在することを確実に伝えることはできず、存在する可能性があるとしか言えません。ブルームフィルターインデックスを使用して値が存在するかどうかを判断すると、偽陽性が発生する可能性があります。つまり、ブルームフィルターインデックスがデータファイルにフィルタリングされるデータが含まれていると検出しても、実際にはデータファイルにデータが含まれていないことがあります。
使用上の注意
- 重複キーまたは主キーテーブルのすべての列にブルームフィルターインデックスを作成できます。集計テーブルまたはユニークキーテーブルの場合、キー列にのみブルームフィルターインデックスを作成できます。
- ブルームフィルターインデックスは、以下のデータ型の列に作成できます:
- 数値型: SMALLINT, INT, BIGINT, および LARGEINT。
- 文字列型: CHAR, STRING, および VARCHAR。
- 日付型: DATE および DATETIME。
- ブルームフィルターインデックスは、
in
および=
演算子を含むクエリのパフォーマンスを向上させることができます。例えば、Select xxx from table where x in {}
やSelect xxx from table where column = xxx
などです。 - クエリがブルームフィルターインデックスを使用しているかどうかは、クエリのプロファイルの
BloomFilterFilterRows
フィールドを確認することで確認できます。
ブルームフィルターインデックスの作成
テーブルを作成する際に PROPERTIES
で bloom_filter_columns
パラメータを指定することで、列にブルームフィルターインデックスを作成できます。例えば、table1
の k1
および k2
列にブルームフィルターインデックスを作成します。
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");
複数の列に対してブルームフィルターインデックスを一度に作成するには、これらの列名を指定します。これらの列名はカンマ(,
)で区切る必要があります。CREATE TABLE ステートメントの他のパラメータの説明については、CREATE TABLE を参照してください。
ブルームフィルターインデックスの表示
例えば、次のステートメントは table1
のブルームフィルターインデックスを表示します。出力の説明については、SHOW CREATE TABLE を参照してください。
SHOW CREATE TABLE table1;
ブルームフィルターインデックスの変更
ALTER TABLE ステートメントを使用して、ブルームフィルターインデックスを追加、削減、削除できます。
-
次のステートメントは、
v1
列にブルームフィルターインデックスを追加します。ALTER TABLE table1 SET ("bloom_filter_columns" = "k1,k2,v1");
-
次のステートメントは、
k2
列のブルームフィルターインデックスを削減します。ALTER TABLE table1 SET ("bloom_filter_columns" = "k1");
-
次のステートメントは、
table1
のすべてのブルームフィルターインデックスを削除します。ALTER TABLE table1 SET ("bloom_filter_columns" = "");
注: インデックスの変更は非同期操作です。この操作の進行状況は、SHOW ALTER TABLE を実行することで確認できます。テーブルごとに一度に1つのインデックス変更タスクしか実行できません。