All Products
Search
Document Center

Hologres:Roaringbitmap

Last Updated:Aug 19, 2026

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;
    Penting

    Hindari 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) atau roaringbitmap64 (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.

  1. Aktifkan ekstensi.

    CREATE EXTENSION roaringbitmap;
  2. Buat tabel untuk menyimpan data roaring bitmap.

    -- Buat tabel t1.
    CREATE TABLE public.t1 (id integer, bitmap roaringbitmap);
  3. 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;
  4. 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}
  5. 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
  6. Hitung kardinalitas (jumlah bit yang di-set).

    SELECT RB_CARDINALITY(bitmap) FROM public.t1;

    Output yang diharapkan:

     id | rb_cardinality
    ----+----------------
      1 |             10
      2 |            100
  7. 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
  8. 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}