すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:Bitmap Index(Beta)

最終更新日:Jul 18, 2026

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 テーブルのデータに基づいています。

非パーティションテーブル

  1. emp テーブルを作成します。

    CREATE TABLE IF NOT EXISTS emp( 
      empno BIGINT, 
      ename STRING, 
      job STRING, 
      mgr BIGINT, 
      sex STRING 
    );
  2. データを挿入します。

    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');

パーティションテーブル

  1. 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);
  2. パーティションの作成。

    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. 例

    • 例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       | 
      +------------+------------+------------+------------+------------+
  2. インデックス効果の確認

    1. コンソールの実行ログで、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
    2. 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;