メインコンテンツまでスキップ
バージョン: 3.2

ブルームフィルターインデックス

このトピックでは、ブルームフィルターインデックスの作成と変更方法、およびその動作について説明します。

ブルームフィルターインデックスは、テーブルのデータファイル内のフィルタリングされたデータの存在の可能性を検出するために使用される、スペース効率の高いデータ構造です。ブルームフィルターインデックスがフィルタリングするデータが特定のデータファイルに存在しないことを検出した場合、StarRocks はそのデータファイルのスキャンをスキップします。ブルームフィルターインデックスは、列(例えば ID)が比較的高いカーディナリティを持つ場合に応答時間を短縮できます。

クエリがソートキー列にヒットした場合、StarRocks は プレフィックスインデックス を使用して効率的にクエリ結果を返します。ただし、データブロックのプレフィックスインデックスエントリは36バイトを超えることはできません。ソートキーとして使用されておらず、比較的高いカーディナリティを持つ列のクエリパフォーマンスを向上させたい場合、その列に対してブルームフィルターインデックスを作成できます。

動作の仕組み

例えば、特定のテーブル table1column1 にブルームフィルターインデックスを作成し、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 フィールドを確認することで確認できます。

ブルームフィルターインデックスの作成

テーブルを作成する際に、PROPERTIESbloom_filter_columns パラメータを指定することで、列に対してブルームフィルターインデックスを作成できます。例えば、table1k1 および 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)
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回に1つのテーブルに対してのみインデックス変更タスクを実行できます。