All Products
Search
Document Center

MaxCompute:Bitmap Index(Beta)

Last Updated:Jul 18, 2026

Bitmap Index merupakan jenis indeks baru yang mendukung pembuatan indeks pada kolom dengan tingkat duplikasi tinggi serta mampu memberikan kemampuan query nilai titik (point value query) dan query rentang (range query) secara efisien. Artikel ini menjelaskan cara menggunakan tipe indeks Bitmap Index di MaxCompute.

Latar Belakang

Saat ini, MaxCompute menyediakan empat jenis indeks: Hash Clustering, Range Clustering, Bloomfilter Index, dan Bitmap Index. Keempat jenis indeks tersebut mendukung filtering untuk query titik. Dibandingkan dengan Range Clustering yang hanya dapat melakukan filtering rentang jika memenuhi prinsip pencocokan paling kiri (leftmost matching), Bloomfilter Index sangat cocok untuk skenario query titik, sedangkan Bitmap Index lebih difokuskan pada skenario query rentang. Pada skenario filtering rentang, Bitmap Index dapat menyaring lebih dari 60% data sehingga mempercepat query.

Bitmap Index memiliki keunggulan berikut:

  • Setiap query Bitmap Index bersifat independen dan tidak terikat oleh prinsip pencocokan paling kiri.

  • Mendukung multi-kolom. Anda dapat membuat Bitmap Index pada satu atau beberapa kolom tabel serta mengombinasikannya dengan indeks lain untuk mempercepat query secara bersamaan.

  • Filtering efektif. Bitmap Index membuat bitmap untuk setiap nilai sehingga hasil filtering dapat tepat hingga tingkat baris. Pada skenario dengan tingkat duplikasi tinggi dan distribusi data yang padat, efek filtering-nya sangat baik.

  • Cocok untuk operasi irisan dan gabungan (operasi OR dan AND), sehingga dapat mengoptimalkan query multidimensi.

Skenario Penggunaan

  • Cocok untuk kolom dengan tingkat duplikasi tinggi dan hanya memiliki beberapa nilai unik, misalnya jenis kelamin, kota, dll.

  • Cocok untuk menjalankan operasi logika seperti AND dan OR karena dapat melakukan operasi bitwise pada Bitmap secara efisien.

Catatan

Pada kasus dengan cardinality terlalu besar atau efek filtering query yang buruk, penggunaan Bitmap Index dapat menyebabkan konsumsi ruang penyimpanan yang signifikan dan penurunan performa baca. Oleh karena itu, tidak disarankan membuat Bitmap Index pada kolom berikut:

  • Kolom dengan tingkat duplikasi rendah, misalnya nomor KTP, nomor telepon, dll.

  • Kolom yang sering diperbarui atau dimodifikasi.

Penjelasan Biaya

  • Bagian penyimpanan: Setelah indeks dibuat, akan mengonsumsi ruang penyimpanan tambahan. Biaya dihitung berdasarkan ukuran penyimpanan aktual indeks dan digabungkan dengan penggunaan penyimpanan data proyek, dengan tarif yang sama seperti biaya penyimpanan standar.

  • Bagian komputasi: Pembuatan indeks akan memicu tugas komputasi tambahan sehingga meningkatkan konsumsi resource komputasi. Pada skema prabayar, resource prabayar proyek akan digunakan langsung. Pada skema pascabayar, biaya tugas komputasi terkait indeks = Harga satuan SQL pascabayar * kompleksitas 1 * volume data input tugas terkait indeks.

Batasan Penggunaan

  • Saat ini hanya mendukung pembuatan pada tipe data non-nested STRING, CHAR, VARCHAR, TINYINT, SMALLINT, INT, BIGINT, dan DOUBLE.

  • Mendukung percepatan query berikut: <=, <, =, >, >=, IN, BETWEEN, dan IS NULL.

Hal yang Perlu Diperhatikan

  • Sebelum membuat Bitmap Index, jalankan perintah setproject odps.schema.evolution.enable=true; untuk mengaktifkan perubahan struktur tabel (Schema Evolution).

  • Saat ini hanya mendukung pembuatan Bitmap Index untuk satu kolom dalam satu perintah. Jika Anda ingin membuat Bitmap Index untuk beberapa kolom dalam satu tabel, Anda harus menjalankan pernyataan pembuatan Bitmap Index beberapa kali.

  • Setelah indeks dibuat, sistem akan secara otomatis menghasilkan indeks Bitmap saat data dimasukkan.

  • Agar Bitmap Index berlaku pada data yang sudah ada (existing data), Anda perlu membangun ulang (rebuild) Bitmap Index tersebut.

Data Contoh

Catatan

Semua contoh sintaksis terkait Bitmap Index dalam dokumen ini didasarkan pada data dari tabel emp dan tabel sale_detail.

Tabel Non-Partisi

  1. Buat tabel emp.

    CREATE TABLE IF NOT EXISTS emp( 
      empno BIGINT, 
      ename STRING, 
      job STRING, 
      mgr BIGINT, 
      sex STRING 
    );
  2. Masukkan data.

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

Tabel Partisi

  1. Buat tabel partisi 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. Buat partisi.

    ALTER TABLE sale_detail ADD PARTITION (sale_date='2023', region='china') PARTITION (sale_date='2024', region='shanghai');

Membuat Bitmap Index

Sintaksis

CREATE BITMAP INDEX <index_name> ON TABLE <table_name> FOR COLUMNS(<col_name>) [COMMENT 'indexcomment'];

Penjelasan Parameter

  • index_name: wajib diisi, nama indeks.

  • table_name: wajib diisi, nama tabel.

  • col_name: wajib diisi, nama kolom. Indeks akan dibuat untuk kolom ini.

Contoh

  • Buat indeks untuk kolom empno pada tabel emp dengan nama empno_index.

    CREATE BITMAP INDEX empno_index 
    ON TABLE emp 
    FOR COLUMNS(empno) 
    COMMENT 'idxcomment';
  • Buat indeks untuk kolom job (posisi pekerjaan) pada tabel emp dengan nama job_index.

    CREATE BITMAP INDEX job_index 
    ON TABLE emp 
    FOR COLUMNS(job) 
    COMMENT 'idxcomment';
  • Buat indeks untuk kolom shop_name pada tabel sale_detail dengan nama shop_name_index.

    CREATE BITMAP INDEX shop_name_index  
    ON TABLE sale_detail 
    FOR COLUMNS(shop_name) 
    COMMENT 'indexcomment';

Membangun Ulang Bitmap Index

Sintaksis

Gunakan perintah berikut untuk membuat ulang Bitmap Index pada data yang sudah ada.

  • Membangun ulang untuk tabel non-partisi.

    ALTER TABLE <table_name> REBUILD BITMAP INDEX;
  • Membangun ulang untuk tabel partisi.

    ALTER TABLE <table_name> PARTITION 
    (<partition_name1=value1>[, partition_name2=value2, ...]) REBUILD BITMAP INDEX;
    Catatan

    Pada tabel partisi, Anda hanya dapat membangun ulang satu partisi dalam satu waktu.

Penjelasan Parameter

  • Tabel non-partisi

    table_name: wajib diisi, nama tabel.

  • Tabel partisi

    • table_name: wajib diisi, nama tabel.

    • partition_name: wajib diisi, nama partisi.

    • value: wajib diisi, nilai partisi.

Contoh

  • Contoh 1: Tabel non-partisi.

    ALTER TABLE emp REBUILD BITMAP INDEX;
  • Contoh 2: Tabel partisi.

    ALTER TABLE sale_detail PARTITION (sale_date='2023', region='china') REBUILD BITMAP INDEX;

Kueri Indeks Bitmap

Sintaksis

SHOW INDEXES ON <table_name>;

Penjelasan Parameter

table_name: wajib diisi, nama tabel.

Contoh

--Lihat indeks pada tabel emp
SHOW INDEXES ON emp;

Hasil yang dikembalikan sebagai berikut.

{"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"}]}

Query Data dan Lihat Efek Bitmap Index

  1. Contoh

    • Contoh 1: Lakukan query titik pada kolom job (posisi pekerjaan).

      SELECT * FROM emp WHERE job = 'clerk';

      Hasil yang dikembalikan sebagai berikut.

      +------------+-------+-----+------------+------------+-----+
      | 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 |
      +------------+-------+-----+------------+------------+-----+
    • Contoh 2: Lakukan query rentang pada kolom empno.

      SELECT * FROM emp WHERE empno BETWEEN 7300 AND 7800;

      Hasil yang dikembalikan sebagai berikut.

      +------------+------------+------------+------------+------------+
      | 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. Lihat efek indeks.

    1. Pada log eksekusi di konsol, klik tautan Log view untuk membuka halaman 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. Pada halaman LogView, cari kata kunci Bitmap di bagian Json Summary untuk melihat efek filtering yang dihasilkan oleh Bitmap Index serta overhead waktu tambahan akibat pembentukan Bitmap Index (tidak termasuk waktu I/O).

      Indikator terkait meliputi BitmapIndexFilteredRowCount (jumlah baris yang difilter), BitmapIndexLatency (waktu pembentukan), BitmapIndexInBytes, dan BitmapIndexOutBytes (byte input dan output), dll.

Menghapus Bitmap Index

Sintaksis

DROP INDEX [IF EXISTS] <index_name> ON TABLE <table_name>;

Penjelasan Parameter

  • index_name: wajib diisi, nama indeks.

  • table_name: wajib diisi, nama tabel.

Contoh

DROP INDEX IF EXISTS job_index ON TABLE emp;