Roaring bitmaps adalah bitmap terkompresi yang lebih unggul dibandingkan dengan bitmap terkompresi tradisional seperti WAH, EWAH, dan Concise. Dalam beberapa skenario, Roaring bitmaps menawarkan performa kompresi yang sangat baik serta kecepatan pengindeksan hampir ratusan kali lebih cepat daripada bitmap terkompresi tradisional, bahkan melebihi kecepatan bitmap tanpa kompresi.
Buat ekstensi pg_roaringbitmap
CREATE EXTENSION if NOT EXISTS roaringbitmap;Jalankan pernyataan berikut untuk melihat versi ekstensi:
SELECT extname,extversion FROM pg_extension WHERE extname = 'roaringbitmap';Contoh hasil:
extname | extversion
---------------+------------
roaringbitmap | 0.5
(1 row)Format input dan output
PolarDB hanya mendukung format input dan output array dan bytea.
Format Input
array:
SELECT roaringbitmap('{1,100,10}'); roaringbitmap ------------------------------------------------ \x3a30000001000000000002001000000001000a006400 (1 row)bytea:
SELECT '\x3a30000001000000000002001000000001000a006400'::roaringbitmap; roaringbitmap ------------------------------------------------ \x3a30000001000000000002001000000001000a006400 (1 row)
Format Output
CatatanFormat output default adalah
bytea. Anda dapat menjalankan perintahroaringbitmap.output_formatuntuk mengubah format output.array:
SET roaringbitmap.output_format='array'; SELECT '{1}'::roaringbitmap; roaringbitmap --------------- {1} (1 row)bytea
SET roaringbitmap.output_format='bytea'; SELECT '{1}'::roaringbitmap; roaringbitmap ---------------------------------------- \x3a3000000100000000000000100000000100 (1 row)
Buat tabel
CREATE TABLE t1 (id integer, bitmap roaringbitmap);Buat bitmap dari array integer
INSERT INTO t1 SELECT 1,rb_build(ARRAY[1,2,3,4,5,6,7,8,9,200]);
INSERT INTO t1 SELECT 2,rb_build_agg(e) FROM generate_series(1,100) e;Fungsi perhitungan bitmap
Fungsi perhitungan bitmap mencakup OR, AND, XOR, dan ANDNOT.
SELECT roaringbitmap('{1,2,3}') | roaringbitmap('{3,4,5}');
SELECT roaringbitmap('{1,2,3}') & roaringbitmap('{3,4,5}');
SELECT roaringbitmap('{1,2,3}') # roaringbitmap('{3,4,5}');
SELECT roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}');Fungsi agregat bitmap
Fungsi agregat bitmap mencakup OR, AND, XOR, dan BUILD.
SELECT rb_or_agg(bitmap) FROM t1;
SELECT rb_and_agg(bitmap) FROM t1;
SELECT rb_xor_agg(bitmap) FROM t1;
SELECT rb_build_agg(e) FROM generate_series(1,100) e;Fungsi perhitungan kardinalitas bitmap
SELECT rb_cardinality('{1,2,3}');Konversi bitmap menjadi array integer
SELECT rb_to_array(bitmap) FROM t1 WHERE id = 1;Konversi bitmap menjadi himpunan bilangan bulat
SELECT unnest(rb_to_array('{1,2,3}'::roaringbitmap));Atau
SELECT rb_iterate('{1,2,3}'::roaringbitmap);Operasi
Operator | Input | Output | Deskripsi | Contoh | Hasil |
& | roaringbitmap,roaringbitmap | roaringbitmap | Operator bitwise AND | roaringbitmap('{1,2,3}') & roaringbitmap('{3,4,5}') | {3} |
| | roaringbitmap,roaringbitmap | roaringbitmap | Operator bitwise OR | roaringbitmap('{1,2,3}') | roaringbitmap('{3,4,5}') | {1,2,3,4,5} |
| | roaringbitmap,integer | roaringbitmap | Menambahkan elemen ke roaring bitmap | roaringbitmap('{1,2,3}') | 6 | {1,2,3,6} |
| | integer,roaringbitmap | roaringbitmap | Menambahkan elemen ke roaring bitmap | 6 | roaringbitmap('{1,2,3}') | {1,2,3,6} |
# | roaringbitmap,roaringbitmap | roaringbitmap | Operator bitwise exclusive OR | roaringbitmap('{1,2,3}') # roaringbitmap('{3,4,5}') | {1,2,4,5} |
<< | roaringbitmap,bigint | roaringbitmap | Geser bit ke kiri | roaringbitmap('{1,2,3}') << 2 | {0,1} |
>> | roaringbitmap,bigint | roaringbitmap | Geser bit ke kanan | roaringbitmap('{1,2,3}') >> 3 | {4,5,6} |
- | roaringbitmap,roaringbitmap | roaringbitmap | Operator offset | roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}') | {1,2} |
- | roaringbitmap,integer | roaringbitmap | Menghapus elemen dari roaring bitmap | roaringbitmap('{1,2,3}') - 3 | {1,2} |
@> | roaringbitmap,roaringbitmap | bool | Operator contains | roaringbitmap('{1,2,3}') @> roaringbitmap('{3,4,5}') | f |
@> | roaringbitmap,integer | bool | Operator contains | roaringbitmap('{1,2,3,4,5}') @> 3 | t |
roaringbitmap,roaringbitmap | bool | Operator contains | roaringbitmap('{1,2,3}') @> 4 | f | |
integer,roaringbitmap | bool | Operator contains | 3 @> roaringbitmap('{1,2,3,4,5}') | t | |
&& | roaringbitmap,roaringbitmap | bool | Operator logika AND | roaringbitmap('{1,2,3}') && roaringbitmap('{3,4,5}') | t |
= | roaringbitmap,roaringbitmap | bool | Operator kesetaraan | roaringbitmap('{1,2,3}') = roaringbitmap('{3,4,5}') | f |
<> | roaringbitmap,roaringbitmap | bool | Operator tidak sama | roaringbitmap('{1,2,3}') <> roaringbitmap('{3,4,5}') | t |
Fungsi fungsionalitas
Fungsi | Input | Output | Deskripsi | Contoh | Hasil |
rb_build | integer[] | roaringbitmap | Buat roaring bitmap dari array integer | rb_build('{1,2,3,4,5}') | {1,2,3,4,5} |
rb_index | roaringbitmap,integer | bigint | Kembalikan indeks berbasis 0 dari elemen dalam roaringbitmap ini, atau -1 jika tidak ada | rb_index('{1,2,3}',3) | 2 |
rb_cardinality | roaringbitmap | bigint | Kembalikan kardinalitas dari roaringbitmap | rb_cardinality('{1,2,3,4,5}') | 5 |
rb_and_cardinality | roaringbitmap,roaringbitmap | bigint | Kembalikan kardinalitas dari AND dua roaringbitmaps | rb_and_cardinality('{1,2,3}',rb_build('{3,4,5}')) | 1 |
rb_or_cardinality | roaringbitmap,roaringbitmap | bigint | Kembalikan kardinalitas dari OR dua roaringbitmaps | rb_or_cardinality('{1,2,3}','{3,4,5}') | 5 |
rb_xor_cardinality | roaringbitmap,roaringbitmap | bigint | Kembalikan kardinalitas dari XOR dua roaringbitmaps | rb_xor_cardinality('{1,2,3}','{3,4,5}') | 4 |
rb_andnot_cardinality | roaringbitmap,roaringbitmap | bigint | Kembalikan kardinalitas dari ANDNOT dua roaringbitmaps | rb_andnot_cardinality('{1,2,3}','{3,4,5}') | 2 |
rb_is_empty | roaringbitmap | boolean | Periksa apakah roaringbitmap kosong. | rb_is_empty('{1,2,3,4,5}') | f |
rb_fill | roaringbitmap,range_start bigint,range_end bigint | roaringbitmap | Isi rentang yang ditentukan (tidak termasuk range_end) | rb_fill('{1,2,3}',5,7) | {1,2,3,5,6} |
rb_clear | roaringbitmap,range_start bigint,range_end bigint | roaringbitmap | Hapus rentang yang ditentukan (tidak termasuk range_end) | rb_clear('{1,2,3}',2,3) | {1,3} |
rb_flip | roaringbitmap,range_start bigint,range_end bigint | roaringbitmap | Negatifkan rentang yang ditentukan (tidak termasuk range_end) | rb_flip('{1,2,3}',2,10) | {1,4,5,6,7,8,9} |
rb_range | roaringbitmap,range_start bigint,range_end bigint | roaringbitmap | Kembalikan set baru dengan rentang yang ditentukan (tidak termasuk range_end) | rb_range('{1,2,3}',2,3) | {2} |
rb_range_cardinality | roaringbitmap,range_start bigint,range_end bigint | bigint | Kembalikan kardinalitas dari rentang yang ditentukan (tidak termasuk range_end) | rb_range_cardinality('{1,2,3}',2,3) | 1 |
rb_min | roaringbitmap | integer | Kembalikan offset terkecil dalam roaringbitmap. Kembalikan NULL jika bitmap kosong | rb_min('{1,2,3}') | 1 |
rb_max | roaringbitmap | integer | Kembalikan offset terbesar dalam roaringbitmap. Kembalikan NULL jika bitmap kosong | rb_max('{1,2,3}') | 3 |
rb_rank | roaringbitmap,integer | bigint | Kembalikan jumlah elemen yang lebih kecil atau sama dengan offset yang ditentukan | rb_rank('{1,2,3}',3) | 3 |
rb_jaccard_dist | roaringbitmap,roaringbitmap | double precision | Kembalikan jarak jaccard (atau koefisien kesamaan Jaccard) dari dua bitmap | rb_jaccard_dist('{1,2,3}','{3,4}') | 0.25 |
rb_select | roaringbitmap,bitset_limit bigint,bitset_offset bigint=0,reverse boolean=false,range_start bigint=0,range_end bigint=4294967296 | roaringbitmap | Kembalikan subset [bitset_offset,bitset_offset+bitset_limit) dari bitmap antara rentang [range_start,range_end) | rb_select('{1,2,3,4,5,6,7,8,9}',5,2) | {3,4,5,6,7} |
rb_to_array | roaringbitmap | integer[] | Konversi roaringbitmap menjadi array integer | rb_to_array(roaringbitmap('{1,2,3}')) | {1,2,3} |
rb_iterate | roaringbitmap | SET of integer | Kembalikan set integer dari data roaringbitmap. | SELECT rb_iterate (rb_build('{1,2,3}')) | 123 |
Fungsi agregat
Fungsi | Input | Output | Deskripsi | Contoh | Hasil |
rb_build_agg | integer | roaringbitmap | Buat roaringbitmap dari set integer | select rb_build_agg(id) from (values (1),(2),(3)) t(id) | {1,2,3} |
rb_or_agg | roaringbitmap | roaringbitmap | Perhitungan agregat AND dari set roaringbitmap | select rb_or_agg(bitmap) from (values (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}')) ) t(bitmap) | {1,2,3,4} |
rb_and_agg | roaringbitmap | roaringbitmap | Perhitungan agregat AND dari set roaringbitmap | select rb_and_agg(bitmap) from (values (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}')) ) t(bitmap) | {2,3} |
rb_xor_agg | roaringbitmap | roaringbitmap | Perhitungan agregat XOR dari set roaringbitmap | select rb_xor_agg(bitmap) from (values (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}')) ) t(bitmap) | {1,4} |
rb_or_cardinality_agg | roaringbitmap | bigint | Perhitungan agregat OR dari set roaringbitmap, kembalikan kardinalitas. | select rb_or_cardinality_agg(bitmap) from (values (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}')) ) t(bitmap) | 4 |
rb_and_cardinality_agg | roaringbitmap | bigint | Perhitungan agregat AND dari set roaringbitmap, kembalikan kardinalitas | select rb_and_cardinality_agg(bitmap) from (values (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}')) ) t(bitmap) | 2 |
rb_xor_cardinality_agg | roaringbitmap | bigint | Perhitungan agregat XOR dari set roaringbitmap, kembalikan kardinalitas | select rb_xor_cardinality_agg(bitmap) from (values (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}')) ) t(bitmap) | 2 |