メインコンテンツまでスキップ

Bloom filter indexing

Bloom filter インデックス

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

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

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

動作原理

例えば、あるテーブル table1column1 にブルームフィルタインデックスを作成し、Select xxx from table1 where column1 = something; のようなクエリを実行します。この場合、StarRocks が table1 のデータファイルをスキャンする際に、以下のような状況が発生します。

  • ブルームフィルタインデックスがデータファイルに存在しないデータを検出した場合、StarRocks はデータファイルのスキャンをスキップしてクエリのパフォーマンスを向上させます。
  • ブルームフィルタインデックスがデータファイルに存在する可能性があるデータを検出した場合、StarRocks はデータファイルを読み込んでデータの存在をチェックします。ブルームフィルタは値の存在を確実に判定できないため、値が存在するかどうかを確実に示すことはできません。ただし、ブルームフィルタインデックスを使用して値の存在を判定すると、偽陽性が発生することがあります。つまり、ブルームフィルタインデックスがデータファイルにデータが存在すると検出するが、実際にはデータファイルにデータが存在しない場合です。

使用上の注意

  • 重複キーまたは主キーテーブルのすべての列に対してブルームフィルタインデックスを作成することができます。集計テーブルまたはユニークキーテーブルの場合、キーカラムに対してのみブルームフィルタインデックスを作成することができます。
  • TINYINT、FLOAT、DOUBLE、DECIMAL列ではブルームフィルタインデックスの作成がサポートされていません。
  • ブルームフィルタインデックスは、in演算子および=演算子を含むクエリのパフォーマンスを改善することができます。例えば、Select xxx from table where x in {}Select xxx from table where column = xxxなどです。
  • クエリがブルームフィルタインデックスを使用しているかどうかを確認するには、クエリのプロファイルのBloomFilterFilterRowsフィールドを表示することができます。

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

PROPERTIES内のbloom_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つのALTER INDEXタスクのみを実行できます。