Bitmap Index は新しいタイプのインデックスで、重複度が高い列にインデックスを構築でき、効率的な等値検索および範囲検索を実現します。本ドキュメントでは、MaxCompute で Bitmap Index を使用する方法について説明します。
背景情報
MaxCompute では現在、Hash Clustering、Range Clustering、Bloomfilter Index、Bitmap Index の 4 種類のインデックスが提供されています。これらすべてのインデックスは等値検索によるフィルタリングをサポートします。Range Clustering は最左一致原則を満たす場合にのみ範囲フィルタリングを提供できるのに対し、Bloomfilter Index は等値検索のシナリオに適しています。一方、Bitmap Index は主に範囲検索のシナリオ向けに設計されており、範囲フィルタリング時に 60% 以上のデータをフィルタリングできるため、クエリの高速化に貢献します。
Bitmap Index には以下の利点があります。
-
各 Bitmap Index のクエリは独立しており、最左一致原則の制限を受けません。
-
複数列をサポートします。テーブルの 1 列または複数列に対して Bitmap Index を作成でき、他のインデックスと組み合わせてクエリをさらに高速化できます。
-
フィルタリング効果に優れています。Bitmap Index は各値ごとにビットマップを構築するため、フィルタリング結果を行単位で正確に特定できます。重複度が高く、かつデータ分布が密なシナリオでは特に高いフィルタリング効果を発揮します。
-
論理和(OR)および論理積(AND)演算に適しており、多次元クエリを最適化できます。
適用シーン
-
重複度が高く、かつ取り得る値の種類が限られている列(例:性別、都市など)に適しています。
-
論理演算(AND や OR など)を実行する必要がある場合に適しており、Bitmap に対するビット演算を効率的に処理できます。
基数が大きすぎる場合やフィルタリング効果が低いクエリでは、ストレージ容量を多く消費したり、読み取りパフォーマンスが低下したりする可能性があるため、以下のような列には Bitmap Index を作成しないことを推奨します。
-
重複度が低い列(例:身分証明書番号、電話番号など)
-
頻繁に更新・変更される列
課金
-
ストレージ部分:インデックス構築後は追加のストレージ領域を消費します。インデックスの実際のストレージサイズに基づいて計測され、プロジェクトのデータストレージ使用量と合算して課金されます。料金体系は標準ストレージ料金と同一です。
-
計算部分:インデックスの構築により追加の計算タスクが発生し、計算リソースの消費量が増加します。プリペイドの場合、プロジェクトのプリペイドリソースが直接使用されます。ポストペイドの場合、インデックス関連の計算タスク費用は
SQLポストペイド単価*複雑度1*インデックス関連タスクの入力データ量で算出されます。
制限事項
-
現時点では、ネストしていない STRING、CHAR、VARCHAR、TINYINT、SMALLINT、INT、BIGINT、DOUBLE 型の列に対してのみ作成できます。
-
以下のクエリの高速化をサポートします:
<=、<、=、>、>=、IN、BETWEEN、およびIS NULL。
注意事項
-
Bitmap Index を作成する前に、
setproject odps.schema.evolution.enable=true;コマンドを実行し、テーブルスキーマの変更(Schema Evolution)を許可する設定を行ってください。 -
現時点では、1 回の操作で 1 列に対してのみ Bitmap Index を作成できます。複数列に対して Bitmap Index を作成する場合は、それぞれの列に対して個別に Bitmap Index 作成文を実行する必要があります。
-
インデックス作成後、データ挿入時にシステムが自動的に Bitmap インデックスを生成します。
-
既存データに対して Bitmap Index を有効にするには、Bitmap Index を再構築する必要があります。
サンプルデータ
Bitmap Index 関連の構文例は、emp テーブルおよび sale_detail テーブルのデータに基づいています。
非パーティションテーブル
-
empテーブルを作成します。CREATE TABLE IF NOT EXISTS emp( empno BIGINT, ename STRING, job STRING, mgr BIGINT, sex STRING ); -
データを挿入します。
INSERT INTO emp(empno,ename,job,mgr,sex) VALUES (7369,'smith','clerk',7902,'Male'), (7499,'allen','salesman',7698,'Female'), (7521,'ward','salesman',7698,'Male'), (7654,'martin','salesman',7698,'Male'), (7698,'blake','manager',7839,'Male'), (7782,'clark','manager',7839,'Male'), (7788,'scott','analyst',7566,'Male'), (7839,'king','president',NULL,'Male'), (7844,'turner','salesman',7698,'Female'), (7876,'adams','clerk',7788,'Female'), (7900,'james','clerk',7698,'Male'), (7902,'ford','analyst',7566,'Male'), (7934,'miller','clerk',7782,'Female');
パーティションテーブル
-
sale_detailパーティションテーブルを作成します。CREATE TABLE IF NOT EXISTS sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE) PARTITIONED BY (sale_date STRING, region STRING); -
パーティションの作成。
ALTER TABLE sale_detail ADD PARTITION (sale_date='2023', region='china') PARTITION (sale_date='2024', region='shanghai');
Bitmap Index の作成
構文
CREATE BITMAP INDEX <index_name> ON TABLE <table_name> FOR COLUMNS(<col_name>) [COMMENT 'indexcomment'];
パラメーター
-
index_name:必須。インデックス名。
-
table_name:必須。テーブル名。
-
col_name:必須。列名。この列に対してインデックスが作成されます。
例
-
empテーブルのempno列に対して、empno_indexという名前のインデックスを作成します。CREATE BITMAP INDEX empno_index ON TABLE emp FOR COLUMNS(empno) COMMENT 'idxcomment'; -
empテーブルの職種列jobに対して、job_indexという名前のインデックスを作成します。CREATE BITMAP INDEX job_index ON TABLE emp FOR COLUMNS(job) COMMENT 'idxcomment'; -
sale_detailテーブルのshop_name列に対して、shop_name_indexという名前のインデックスを作成します。CREATE BITMAP INDEX shop_name_index ON TABLE sale_detail FOR COLUMNS(shop_name) COMMENT 'indexcomment';
Bitmap Index の再構築
構文
以下のコマンドを使用して、既存データに対して Bitmap Index を再生成します。
-
非パーティションテーブルの再構築
ALTER TABLE <table_name> REBUILD BITMAP INDEX; -
パーティションテーブルの再構築
ALTER TABLE <table_name> PARTITION (<partition_name1=value1>[, partition_name2=value2, ...]) REBUILD BITMAP INDEX;説明パーティションテーブルでは、一度に 1 つのパーティションのみ再構築できます。
パラメーター
-
非パーティションテーブル
table_name:必須。テーブル名。
-
パーティションテーブル
-
table_name:必須。テーブル名。
-
partition_name:必須。パーティション名。
-
value:必須。パーティション値。
-
例
-
例 1:非パーティションテーブル
ALTER TABLE emp REBUILD BITMAP INDEX; -
例 2:パーティションテーブル
ALTER TABLE sale_detail PARTITION (sale_date='2023', region='china') REBUILD BITMAP INDEX;
Bitmap Index の確認
構文
SHOW INDEXES ON <table_name>;
パラメーター
table_name: 必須。テーブル名。
例
-- empテーブル上のインデックスを確認
SHOW INDEXES ON emp;
戻り値は以下のとおりです。
{"Indexes": [{
"id": "00c84b0e9e6e4097bdfe3a01b91848ac",
"indexColumns": [{"name": "job"}],
"name": "job_index",
"properties": {"comment": "jobidx"},
"type": "BITMAP"},
{
"id": "18a9755c7a8a4182a6b51165e786aa62",
"indexColumns": [{"name": "empno"}],
"name": "empno_index",
"properties": {"comment": "idxcomment"},
"type": "BITMAP"}]}
データのクエリと Bitmap Index 効果の確認
-
例
-
例1:
job職種列に対してポイント検索を行います。SELECT * FROM emp WHERE job = 'clerk';戻り値は以下のとおりです。
+------------+-------+-----+------------+------------+-----+ | empno | ename | job | mgr | hiredate | sex | +------------+-------+-----+------------+------------+-----+ | 7369 | smith | clerk | 7902 | NULL | Male | | 7876 | adams | clerk | 7788 | NULL | Female | | 7900 | james | clerk | 7698 | NULL | Male | | 7934 | miller | clerk | 7782 | NULL | Female | +------------+-------+-----+------------+------------+-----+ -
例 2:
empno列に対する範囲検索SELECT * FROM emp WHERE empno BETWEEN 7300 AND 7800;戻り値は以下のとおりです。
+------------+------------+------------+------------+------------+ | empno | ename | job | mgr | sex | +------------+------------+------------+------------+------------+ | 7369 | smith | clerk | 7902 | Male | | 7499 | allen | salesman | 7698 | Female | | 7521 | ward | salesman | 7698 | Male | | 7654 | martin | salesman | 7698 | Male | | 7698 | blake | manager | 7839 | Male | | 7782 | clark | manager | 7839 | Male | | 7788 | scott | analyst | 7566 | Male | +------------+------------+------------+------------+------------+
-
-
インデックス効果の確認
-
コンソールの実行ログで、Log view リンクをクリックし、LogView ページを開きます。
2024-11-05 16:46:42 start to get jobId: 2024-11-05 16:46:42 get jobId:20241105084642689g10x9kj2im1 ID = 20241105084642689g10x9kj2im1 Log view: http://logview.odps.aliyun.com/logview/?h=http://service.cn i01t7IkFjd6lvbI16wyJvZHBz0J1JYhQiXSwIRuZmW0N1oiQwsb3ciLC Job Queueing... Summary: resource cost: cpu 0.00 Core * Min, memory 0.00 GB * Min -
LogView ページの Json Summary 欄で「Bitmap」キーワードを検索すると、Bitmap Index によるフィルタリング効果や、Bitmap Index 構築に要した追加時間(IO を含まない)を確認できます。
関連するメトリクスフィールドには、
BitmapIndexFilteredRowCount(フィルタリングされた行数)、BitmapIndexLatency(構築レイテンシ)、BitmapIndexInBytesおよびBitmapIndexOutBytes(入出力バイト数)などがあります。
-
Bitmap Index の削除
構文
DROP INDEX [IF EXISTS] <index_name> ON TABLE <table_name>;
パラメーターの説明
-
index_name:必須。インデックス名。
-
table_name:必須。テーブル名。
例
DROP INDEX IF EXISTS job_index ON TABLE emp;