Roaring bitmap adalah struktur bitmap terkompresi yang efisien, didukung di berbagai bahasa pemrograman dan platform data besar. Di Hologres, fungsi roaring bitmap cocok untuk beban kerja dengan kardinalitas sangat tinggi—seperti deduplikasi, penyaringan berbasis tag, dan koleksi deret waktu.
Cara kerja
Roaring bitmap membagi bilangan bulat 32-bit menjadi 2^16 chunk. Bilangan bulat dalam chunk yang sama memiliki 16 bit paling signifikan yang identik, sedangkan 16 bit paling tidak signifikannya disimpan dalam sebuah Kontainer. Kontainer-Kontainer tersebut disimpan dalam sebuah array dinamis sebagai Indeks primer.
Dua jenis container digunakan untuk menyeimbangkan penyimpanan dan performa:
| Jenis container | Digunakan untuk | Kapasitas |
|---|---|---|
| Array container | Chunk sparse | Hingga 4.096 bilangan bulat |
| Bitmap container | Chunk dense | Lebih dari 4.096 bilangan bulat |
Struktur ini memungkinkan pengambilan nilai yang cepat serta operasi bitwise efisien (AND, OR, XOR) antar container.
Batasan
-
Hanya instans eksklusif Hologres V0.10 dan versi lebih baru yang mendukung fungsi roaring bitmap.
Periksa versi instans Anda di Konsol Hologres. Jika versinya lebih lama dari V0.10, upgrade instans melalui konsol atau bergabung dengan grup DingTalk untuk dukungan teknis. Lihat Kesalahan umum saat persiapan upgrade gagal dan Dapatkan dukungan online untuk Hologres.
-
Fungsi roaring bitmap dimuat ke skema public secara default dan hanya dapat dimuat ke skema public.
-
Mulai dari Hologres V3.1, tipe data RoaringBitmap64 didukung. Beberapa fungsi roaring bitmap dapat memproses data bertipe RoaringBitmap64. Namun, saat memproses data RoaringBitmap64, fungsi-fungsi tersebut tidak mendukung parameter input konstan.
-
Sebelum menggunakan fungsi roaring bitmap, aktifkan ekstensi dengan pernyataan berikut. Ekstensi ini berlaku dalam cakupan database—jalankan sekali per database. Ulangi prosedur ini untuk setiap database baru yang Anda buat.
-- Aktifkan ekstensi. CREATE EXTENSION roaringbitmap;Untuk menghapus ekstensi:
DROP EXTENSION roaringbitmap;PentingHindari
DROP EXTENSION <extension_name> CASCADE;. Opsi CASCADE menghapus ekstensi beserta seluruh datanya dan objek dependennya—termasuk data PostGIS, data roaring bitmap, data Proxima, data log biner, dan data BSI, serta metadata, tabel, tampilan, dan objek server yang dependen. -
Kolom roaring bitmap tidak dapat ditentukan sebagai indeks bitmap atau dictionary.
-
Saat membuat tabel dengan kolom roaring bitmap, tentukan secara eksplisit tipe kolom sebagai
roaringbitmap(32-bit) atauroaringbitmap64(64-bit). Perhitungan campuran antara kedua tipe tersebut tidak didukung.-- Buat tabel dengan kolom roaring bitmap 32-bit. CREATE TABLE t_rb_32 ( bucket int, x roaringbitmap ); -- Buat tabel dengan kolom roaring bitmap 64-bit. CREATE TABLE t_rb_64 ( bucket int, x roaringbitmap64 ); -- Perhitungan campuran menghasilkan error. -- ERROR: operator does not exist: roaringbitmap & roaringbitmap64 SELECT a.x & b.x FROM t_rb_32 a JOIN t_rb_64 b ON a.bucket = b.bucket;
Operator
Semua operator di bawah ini mendukung tipe RoaringBitmap dan RoaringBitmap64 kecuali dinyatakan lain.
| Operator | Tipe input | Tipe output | Deskripsi | Contoh | Hasil |
|---|---|---|---|---|---|
& |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | Sama dengan input | AND | rb_build('{1,2,3}') & rb_build('{3,4,5}') |
{3} |
| |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | Sama dengan input | OR | rb_build('{1,2,3}') | rb_build('{3,4,5}') |
{1,2,3,4,5} |
| |
RoaringBitmap | RoaringBitmap64, INTEGER | RoaringBitmap | RoaringBitmap64 | OR (bitmap, integer); V1.3.16+ | rb_build('{1,2,3}') | 6 |
{1,2,3,6} |
| |
INTEGER, RoaringBitmap | RoaringBitmap64 | RoaringBitmap | RoaringBitmap64 | OR (integer, bitmap); V1.3.16+ | 6 | rb_build('{1,2,3}') |
{1,2,3,6} |
# |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | Sama dengan input | XOR | rb_build('{1,2,3}') # rb_build('{3,4,5}') |
{1,2,4,5} |
<< |
RoaringBitmap | RoaringBitmap64, BIGINT | RoaringBitmap | RoaringBitmap64 | Left shift; V1.3.16+ | rb_build('{1,2,3}') << 2 |
{3,4,5} |
>> |
RoaringBitmap | RoaringBitmap64, BIGINT | RoaringBitmap | RoaringBitmap64 | Right shift; V1.3.16+ | rb_build('{1,2,3}') >> 3 |
— |
- |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | Sama dengan input | ANDNOT (bitmap, bitmap); V1.3.16+ | rb_build('{1,2,3}') - rb_build('{3,4,5}') |
{1,2} |
- |
RoaringBitmap | RoaringBitmap64, INTEGER | RoaringBitmap | RoaringBitmap64 | ANDNOT (bitmap, integer) | rb_build('{1,2,3}') - 3 |
{1,2} |
@> |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | A contains B | rb_build('{1,2,3}') @> rb_build('{3,4,5}') |
false |
@> |
RoaringBitmap | RoaringBitmap64, INTEGER | BOOLEAN | A contains integer | rb_build('{1,2,3}') @> 3 |
true |
<@ |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | A is contained by B | rb_build('{1,2,3}') <@ rb_build('{3,4,5}') |
false |
<@ |
INTEGER, RoaringBitmap | RoaringBitmap64 | BOOLEAN | Integer is contained by A | 3 <@ rb_build('{1,2,3}') |
true |
&& |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | A intersects B | rb_build('{1,2,3}') && rb_build('{3,4,5}') |
true |
= |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | Equal | rb_build('{1,2,3}') = rb_build('{3,4,5}') |
false |
<> |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | Not equal | rb_build('{1,2,3}') <> rb_build('{3,4,5}') |
true |
Fungsi roaring bitmap
Fungsi yang mendukung RoaringBitmap dan RoaringBitmap64
| Fungsi | Tipe input | Tipe output | Deskripsi | Contoh | Hasil |
|---|---|---|---|---|---|
rb_build_agg |
INTEGER | BIGINT | RoaringBitmap | RoaringBitmap64 | Mengagregasi offset menjadi roaring bitmap. Input BIGINT (menghasilkan RoaringBitmap64) memerlukan V3.1+. | rb_build_agg(1) |
{1} |
rb_cardinality |
RoaringBitmap | RoaringBitmap64 | INTEGER | Mengembalikan jumlah elemen dalam roaring bitmap. | rb_cardinality(rb_build('{1,2,3,4,5}')) |
5 |
rb_and_cardinality |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | INTEGER | Mengembalikan kardinalitas hasil AND dua roaring bitmap. | rb_and_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) |
1 |
rb_or_cardinality |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | INTEGER | Mengembalikan kardinalitas hasil OR dua roaring bitmap. | rb_or_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) |
5 |
rb_range |
RoaringBitmap | RoaringBitmap64, BIGINT, BIGINT | RoaringBitmap | RoaringBitmap64 | Mengembalikan elemen dalam rentang [start, end), dengan start berbasis 1. Memerlukan V1.3.16+. | rb_range(rb_build('{1,2,3}'), 2, 3) |
— |
rb_minimum |
RoaringBitmap | RoaringBitmap64 | INTEGER | Mengembalikan offset minimum. Mengembalikan -1 jika bitmap kosong. | rb_minimum(rb_build('{1,2,3}')) |
1 |
rb_maximum |
RoaringBitmap | RoaringBitmap64 | INTEGER | Mengembalikan offset maksimum. Mengembalikan 0 jika bitmap kosong. | rb_maximum(rb_build('{1,2,3}')) |
3 |
rb_to_array |
RoaringBitmap | RoaringBitmap64 | INTEGER[] | Mengonversi roaring bitmap menjadi array integer. | rb_to_array(rb_build('{1,2,3}')) |
{1,2,3} |
rb_to_array_string |
RoaringBitmap | RoaringBitmap64, TEXT | TEXT | Mengonversi roaring bitmap menjadi string, dengan elemen-elemen digabung menggunakan delimiter yang ditentukan. | rb_to_array_string(rb_build('{1,2,3}'), ',') |
1,2,3 |
Fungsi yang hanya mendukung RoaringBitmap64
| Fungsi | Tipe input | Tipe output | Deskripsi | Contoh | Hasil |
|---|---|---|---|---|---|
rb64_build |
BIGINT[] | RoaringBitmap64 | Membuat roaring bitmap 64-bit dari array BIGINT. Memerlukan V3.1+. | Lihat contoh di bawah. | — |
-- Persiapkan data.
CREATE TABLE public.tn (
id INT,
num BIGINT[]
);
INSERT INTO public.tn ("id", "num") VALUES (01, '{1,2}');
SELECT rb64_build(num) rb_num, num FROM public.tn;
Output yang diharapkan:
rb_num | num
--------------------------------------------------------------------------------+------
\x030100000000000000000000003a30000001000000000001001000000001000200 | {1,2}
Fungsi yang hanya mendukung RoaringBitmap (32-bit)
| Fungsi | Tipe input | Tipe output | Deskripsi | Contoh | Hasil |
|---|---|---|---|---|---|
rb_build |
INTEGER[] | RoaringBitmap | Membuat roaring bitmap 32-bit dari array integer. | rb_build('{1,2,3,4,5}') |
{1,2,3,4,5} |
roaringbitmap_in |
TEXT | RoaringBitmap | Mengonversi roaring bitmap yang dikodekan dalam TEXT ke tipe RoaringBitmap. Memerlukan V2.1.33+. | Lihat contoh di bawah. | — |
rb_index |
RoaringBitmap, INTEGER | BIGINT | Mengembalikan indeks berbasis 0 dari suatu elemen. Mengembalikan -1 jika elemen tidak ada. Memerlukan V1.3.16+. | rb_index(rb_build('{1,2,3}'), 3) |
2 |
rb_and_null2empty |
RoaringBitmap, RoaringBitmap | RoaringBitmap | Operasi AND. Jika salah satu input NULL, mengembalikan input lainnya; jika salah satu input adalah bitmap kosong ({}), mengembalikan {}. Memerlukan V1.1.42+. | rb_and_null2empty(rb_build(null), rb_build('{3,4,5}')) |
{} |
rb_or_null2empty |
RoaringBitmap, RoaringBitmap | RoaringBitmap | Operasi OR; memperlakukan input NULL sebagai bitmap kosong. Memerlukan V1.1.42+. | rb_or_null2empty(rb_build(null), rb_build('{3,4,5}')) |
{3,4,5} |
rb_andnot_null2empty |
RoaringBitmap, RoaringBitmap | RoaringBitmap | Operasi ANDNOT; memperlakukan input NULL sebagai bitmap kosong. Memerlukan V1.1.42+. | rb_andnot_null2empty(rb_build(null), rb_build('{3,4,5}')) |
{} |
rb_and_null2empty_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | Mengembalikan kardinalitas AND. Memperlakukan input NULL sebagai bitmap kosong ({}). Memerlukan V1.1.42+. | rb_and_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) |
0 |
rb_or_null2empty_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | Mengembalikan kardinalitas OR; memperlakukan input NULL sebagai bitmap kosong. Memerlukan V1.1.42+. | rb_or_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) |
3 |
rb_xor_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | Mengembalikan kardinalitas hasil XOR dua roaring bitmap. | rb_xor_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) |
4 |
rb_andnot_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | Mengembalikan kardinalitas hasil ANDNOT dua roaring bitmap. | rb_andnot_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) |
2 |
rb_andnot_null2empty_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | Mengembalikan kardinalitas ANDNOT; memperlakukan input NULL sebagai bitmap kosong. Memerlukan V1.1.42+. | rb_andnot_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) |
0 |
rb_is_empty |
RoaringBitmap | BOOLEAN | Memeriksa apakah roaring bitmap kosong. | rb_is_empty(rb_build('{1,2,3,4,5}')) |
false |
rb_fill |
RoaringBitmap, BIGINT, BIGINT | RoaringBitmap | Mengisi offset dalam [start, end), tidak termasuk end. Memerlukan V1.3.16+. | rb_fill(rb_build('{1,2,3}'), 5, 7) |
{1,2,3,5,6} |
rb_clear |
RoaringBitmap, BIGINT, BIGINT | RoaringBitmap | Mengosongkan offset dalam [start, end), tidak termasuk end. Memerlukan V1.3.16+. | rb_clear(rb_build('{1,2,3}'), 2, 3) |
— |
rb_contains_bitmap |
RoaringBitmap, RoaringBitmap | BOOLEAN | Memeriksa apakah bitmap pertama berisi semua elemen bitmap kedua. | rb_contains_bitmap(rb_build('{1,2,3}'), rb_build('{3}')) |
true |
rb_flip |
RoaringBitmap, INTEGER, INTEGER | RoaringBitmap | Membalik offset dalam rentang yang ditentukan. | rb_flip(rb_build('{1,2,3}'), 2, 3) |
— |
rb_range_cardinality |
RoaringBitmap, BIGINT, BIGINT | BIGINT | Mengembalikan kardinalitas elemen dalam [start, end), dengan start berbasis 1. Memerlukan V1.3.16+. | rb_range_cardinality(rb_build('{1,2,3}'), 2, 3) |
— |
rb_rank |
RoaringBitmap, INTEGER | INTEGER | Mengembalikan jumlah elemen yang kurang dari atau sama dengan offset yang ditentukan. | rb_rank(rb_build('{1,2,3}'), 3) |
3 |
rb_jaccard_dist |
RoaringBitmap, RoaringBitmap | DOUBLE PRECISION | Mengembalikan jarak Jaccard atau koefisien kemiripan Jaccard antara dua roaring bitmap. Memerlukan V1.3.16+. | rb_jaccard_dist(rb_build('{1,2,3}'), rb_build('{3,4}')) |
0,75 |
rb_select |
RoaringBitmap, bitset_limit BIGINT, bitset_offset BIGINT=0, reverse BOOLEAN=false, range_start BIGINT=-2147483648, range_end BIGINT=2147483647 | RoaringBitmap | Mengembalikan subset [bitset_offset, bitset_offset+bitset_limit) dari rentang [range_start, range_end). | rb_select(rb_build('{1,2,3,4,5,6,7,8,9}'), 5, 2) |
— |
rb_iterate |
RoaringBitmap | Set of INTEGER | Mengembalikan setiap offset dalam roaring bitmap sebagai baris. | rb_iterate(rb_build('{1,2,3}')) |
1, 2, 3 |
Contoh `roaringbitmap_in`:
-- Buat tabel contoh.
CREATE TABLE rb_text (
id int,
a text
);
-- Masukkan data.
INSERT INTO rb_text
VALUES (1, '\x3a300000010000000000090010000000010002000300040005000600070008000900c800');
-- Konversi ke RoaringBitmap dan hitung kardinalitas AND.
SELECT
rb_and_cardinality_agg(roaringbitmap_in(a::cstring))
FROM
rb_text;
Output yang diharapkan:
rb_and_cardinality_agg
------------------------
10
Fungsi agregat roaring bitmap
Fungsi yang mendukung RoaringBitmap dan RoaringBitmap64
Semua contoh di bawah menggunakan input multi-baris untuk menunjukkan bagaimana agregasi menggabungkan beberapa bitmap.
| Fungsi | Tipe input | Tipe output | Deskripsi | Contoh | Hasil |
|---|---|---|---|---|---|
rb_or_agg |
RoaringBitmap | RoaringBitmap64 | Sama dengan input | Agregasi OR pada semua baris input. | Lihat contoh di bawah. | — |
rb_and_agg |
RoaringBitmap | RoaringBitmap64 | Sama dengan input | Agregasi AND pada semua baris input. | Lihat contoh di bawah. | — |
rb_or_cardinality_agg |
RoaringBitmap | RoaringBitmap64 | INTEGER | Mengembalikan kardinalitas hasil agregasi OR. | Lihat contoh di bawah. | — |
rb_and_cardinality_agg |
RoaringBitmap | RoaringBitmap64 | INTEGER | Mengembalikan kardinalitas hasil agregasi AND. | Lihat contoh di bawah. | — |
-- Agregasi OR: mengembalikan gabungan semua bitmap input.
SELECT rb_or_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Hasil: {1,2,3,4}
-- Agregasi AND: mengembalikan irisan semua bitmap input.
SELECT rb_and_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Hasil: {2,3}
-- Agregasi kardinalitas OR.
SELECT rb_or_cardinality_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Hasil: 4
-- Agregasi kardinalitas AND.
SELECT rb_and_cardinality_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Hasil: 2
Fungsi yang hanya mendukung RoaringBitmap (32-bit)
| Fungsi | Tipe input | Tipe output | Deskripsi | Contoh | Hasil |
|---|---|---|---|---|---|
rb_xor_agg |
RoaringBitmap | RoaringBitmap | Agregasi XOR pada semua baris input. | Lihat contoh di bawah. | — |
rb_xor_cardinality_agg |
RoaringBitmap | INTEGER | Mengembalikan kardinalitas hasil agregasi XOR. | Lihat contoh di bawah. | — |
-- Agregasi XOR: mengembalikan elemen yang hanya ada di salah satu dari dua bitmap.
SELECT rb_xor_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Hasil: {1,4}
-- Agregasi kardinalitas XOR.
SELECT rb_xor_cardinality_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Hasil: 2
Fungsi roaring bitmap lainnya
Fungsi berikut hanya mendukung tipe RoaringBitmap (32-bit).
| Fungsi | Tipe input | Tipe output | Deskripsi | Contoh | Hasil |
|---|---|---|---|---|---|
roaringbitmap_text |
TEXT, BOOLEAN | RoaringBitmap | Mendeserialisasi data RoaringBitmap biner dari TEXT ke struktur RoaringBitmap. Parameter kedua mengontrol verifikasi format — atur ke true untuk menghindari data bitmap yang tidak valid. |
roaringbitmap_text(':0', true) |
— |
rb_to_text |
RoaringBitmap | TEXT | Mengonversi struktur RoaringBitmap ke representasi TEXT binernya. | rb_to_text(rb_build('{1,2,3}')) |
\x3a300000... |
Contoh
Contoh end-to-end berikut menunjukkan alur kerja lengkap: aktifkan ekstensi, buat tabel, masukkan data, jalankan operasi bitwise, dan periksa hasilnya.
-
Aktifkan ekstensi.
CREATE EXTENSION roaringbitmap; -
Buat tabel untuk menyimpan data roaring bitmap.
-- Buat tabel t1. CREATE TABLE public.t1 (id integer, bitmap roaringbitmap); -
Masukkan data roaring bitmap.
-- Bangun bitmap dari array eksplisit. INSERT INTO public.t1 SELECT 1, RB_BUILD(ARRAY[1,2,3,4,5,6,7,8,9,200]); -- Bangun bitmap dengan mengagregasi deret yang di-generate. INSERT INTO public.t1 SELECT 2, RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e; -
Jalankan operasi bitwise.
-- OR kedua bitmap. SELECT RB_OR(a.bitmap, b.bitmap) FROM (SELECT bitmap FROM public.t1 WHERE id = 1) AS a, (SELECT bitmap FROM public.t1 WHERE id = 2) AS b;Output yang diharapkan (gabungan {1..9, 200} dan {1..100}):
rb_or ------- {1,2,3,4,5,6,7,8,9,10,...,100,200} -
Jalankan operasi agregat untuk menggabungkan semua bitmap dalam tabel.
SELECT RB_OR_AGG(bitmap) FROM public.t1; -- gabungan semua bitmap SELECT RB_AND_AGG(bitmap) FROM public.t1; -- irisan semua bitmap SELECT RB_XOR_AGG(bitmap) FROM public.t1; -- selisih simetris SELECT RB_BUILD_AGG(id) FROM public.t1; -- bangun bitmap dari kolom id -
Hitung kardinalitas (jumlah bit yang di-set).
SELECT RB_CARDINALITY(bitmap) FROM public.t1;Output yang diharapkan:
id | rb_cardinality ----+---------------- 1 | 10 2 | 100 -
Daftar semua offset yang di-set.
SELECT RB_ITERATE(bitmap) FROM public.t1 WHERE id = 1;Output yang diharapkan:
rb_iterate ------------ 1 2 3 4 5 6 7 8 9 200 -
Konversi roaring bitmap ke array.
SELECT RB_TO_ARRAY(bitmap) FROM public.t1 WHERE id = 1;Output yang diharapkan:
rb_to_array -------------------------------- {1,2,3,4,5,6,7,8,9,200}