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.
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, danIS 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
Semua contoh sintaksis terkait Bitmap Index dalam dokumen ini didasarkan pada data dari tabel emp dan tabel sale_detail.
Tabel Non-Partisi
-
Buat tabel
emp.CREATE TABLE IF NOT EXISTS emp( empno BIGINT, ename STRING, job STRING, mgr BIGINT, sex STRING ); -
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
-
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); -
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
empnopada tabelempdengan namaempno_index.CREATE BITMAP INDEX empno_index ON TABLE emp FOR COLUMNS(empno) COMMENT 'idxcomment'; -
Buat indeks untuk kolom
job(posisi pekerjaan) pada tabelempdengan namajob_index.CREATE BITMAP INDEX job_index ON TABLE emp FOR COLUMNS(job) COMMENT 'idxcomment'; -
Buat indeks untuk kolom
shop_namepada tabelsale_detaildengan namashop_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;CatatanPada 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
-
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 | +------------+------------+------------+------------+------------+
-
-
Lihat efek indeks.
-
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 -
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, danBitmapIndexOutBytes(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;