All Products
Search
Document Center

PolarDB:pg_roaringbitmap

Last Updated:Mar 28, 2026

The pg_roaringbitmap plug-in adds a roaringbitmap data type and a full set of bitmap operators and functions to PolarDB. Roaring bitmaps outperform traditional compressed bitmap formats such as WAH, EWAH, and Concise. In certain workloads, they provide indexing speeds almost hundreds of times faster than traditional compressed bitmaps — faster even than uncompressed bitmaps.

Common use cases include user segmentation, ad targeting, funnel analysis, and tag-based filtering at scale.

Install the plug-in

CREATE EXTENSION IF NOT EXISTS roaringbitmap;

Verify the installation:

\dx

Expected output:

                    List of installed extensions
     Name      | Version |   Schema   |         Description
---------------+---------+------------+------------------------------
 plpgsql       | 1.0     | pg_catalog | PL/pgSQL procedural language
 roaringbitmap | 0.5     | public     | support for Roaring Bitmaps
(2 rows)

Quick start

The following walkthrough covers the core usage pattern: create a table, insert bitmap data, run bitmap operations, run aggregate queries, and iterate over results.

1. Create a table with a roaringbitmap column.

CREATE TABLE t1 (id integer, bitmap roaringbitmap);

2. Insert bitmap data.

Build a bitmap from an explicit integer array:

INSERT INTO t1 SELECT 1, rb_build(ARRAY[1,2,3,4,5,6,7,8,9,200]);

Build a bitmap by aggregating a generated series:

INSERT INTO t1 SELECT 2, rb_build_agg(e) FROM generate_series(1,100) e;

3. Run bitmap operations.

All four binary operations are supported: OR, AND, XOR, and ANDNOT.

SELECT roaringbitmap('{1,2,3}') | roaringbitmap('{3,4,5}');  -- OR:    {1,2,3,4,5}
SELECT roaringbitmap('{1,2,3}') & roaringbitmap('{3,4,5}');  -- AND:   {3}
SELECT roaringbitmap('{1,2,3}') # roaringbitmap('{3,4,5}');  -- XOR:   {1,2,4,5}
SELECT roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}');  -- ANDNOT:{1,2}

4. Run aggregate queries.

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;

5. Count elements (cardinality).

SELECT rb_cardinality('{1,2,3}');

6. Iterate over elements.

Convert to an integer array:

SELECT rb_to_array(bitmap) FROM t1 WHERE id = 1;

Return elements as a set:

SELECT rb_iterate('{1,2,3}'::roaringbitmap);

Input and output formats

PolarDB supports only array and bytea input and output formats.

Input formats

  • array:

    SELECT roaringbitmap('{1,100,10}');
    -- \x3a30000001000000000002001000000001000a006400
  • bytea:

    SELECT '\x3a30000001000000000002001000000001000a006400'::roaringbitmap;
    -- \x3a30000001000000000002001000000001000a006400

Output format

The default output format is bytea. Change it with roaringbitmap.output_format:

SET roaringbitmap.output_format = 'bytea';
SELECT '{1}'::roaringbitmap;
-- \x3a3000000100000000000000100000000100

SET roaringbitmap.output_format = 'array';
SELECT '{1}'::roaringbitmap;
-- {1}

Operators

OperatorInputOutputDescriptionExampleResult
&roaringbitmap, roaringbitmaproaringbitmapBitwise ANDroaringbitmap('{1,2,3}') & roaringbitmap('{3,4,5}'){3}
|roaringbitmap, roaringbitmaproaringbitmapBitwise ORroaringbitmap('{1,2,3}') | roaringbitmap('{3,4,5}'){1,2,3,4,5}
|roaringbitmap, integerroaringbitmapAdd an elementroaringbitmap('{1,2,3}') | 6{1,2,3,6}
|integer, roaringbitmaproaringbitmapAdd an element6 | roaringbitmap('{1,2,3}'){1,2,3,6}
#roaringbitmap, roaringbitmaproaringbitmapBitwise XORroaringbitmap('{1,2,3}') # roaringbitmap('{3,4,5}'){1,2,4,5}
<<roaringbitmap, bigintroaringbitmapBitwise left shiftroaringbitmap('{1,2,3}') << 2{0,1}
>>roaringbitmap, bigintroaringbitmapBitwise right shiftroaringbitmap('{1,2,3}') >> 3{4,5,6}
-roaringbitmap, roaringbitmaproaringbitmapANDNOT (difference)roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}'){1,2}
-roaringbitmap, integerroaringbitmapRemove an elementroaringbitmap('{1,2,3}') - 3{1,2}
@>roaringbitmap, roaringbitmapboolContainsroaringbitmap('{1,2,3}') @> roaringbitmap('{3,4,5}')f
@>roaringbitmap, integerboolContains elementroaringbitmap('{1,2,3,4,5}') @> 3t
<@roaringbitmap, roaringbitmapboolIs contained byroaringbitmap('{1,2,3}') <@ roaringbitmap('{3,4,5}')f
<@integer, roaringbitmapboolIs member of3 <@ roaringbitmap('{3,4,5}')t
&&roaringbitmap, roaringbitmapboolIntersectsroaringbitmap('{1,2,3}') && roaringbitmap('{3,4,5}')t
=roaringbitmap, roaringbitmapboolEqualroaringbitmap('{1,2,3}') = roaringbitmap('{3,4,5}')f
<>roaringbitmap, roaringbitmapboolNot equalroaringbitmap('{1,2,3}') <> roaringbitmap('{3,4,5}')t

Functions

Scalar functions

FunctionInputOutputDescriptionExampleResult
rb_buildinteger[]roaringbitmapBuild a bitmap from an integer arrayrb_build('{1,2,3,4,5}'){1,2,3,4,5}
rb_indexroaringbitmap, integerbigintReturn the 0-based index of the element, or -1 if not foundrb_index('{1,2,3}', 3)2
rb_cardinalityroaringbitmapbigintReturn the number of elementsrb_cardinality('{1,2,3,4,5}')5
rb_and_cardinalityroaringbitmap, roaringbitmapbigintReturn the cardinality of the AND resultrb_and_cardinality('{1,2,3}', rb_build('{3,4,5}'))1
rb_or_cardinalityroaringbitmap, roaringbitmapbigintReturn the cardinality of the OR resultrb_or_cardinality('{1,2,3}', '{3,4,5}')5
rb_xor_cardinalityroaringbitmap, roaringbitmapbigintReturn the cardinality of the XOR resultrb_xor_cardinality('{1,2,3}', '{3,4,5}')4
rb_andnot_cardinalityroaringbitmap, roaringbitmapbigintReturn the cardinality of the ANDNOT resultrb_andnot_cardinality('{1,2,3}', '{3,4,5}')2
rb_is_emptyroaringbitmapbooleanReturn true if the bitmap has no elementsrb_is_empty('{1,2,3,4,5}')f
rb_fillroaringbitmap, range_start bigint, range_end bigintroaringbitmapAdd all integers in [range_start, range_end)rb_fill('{1,2,3}', 5, 7){1,2,3,5,6}
rb_clearroaringbitmap, range_start bigint, range_end bigintroaringbitmapRemove all integers in [range_start, range_end)rb_clear('{1,2,3}', 2, 3){1,3}
rb_fliproaringbitmap, range_start bigint, range_end bigintroaringbitmapNegate all bits in [range_start, range_end)rb_flip('{1,2,3}', 2, 10){1,4,5,6,7,8,9}
rb_rangeroaringbitmap, range_start bigint, range_end bigintroaringbitmapReturn elements in [range_start, range_end)rb_range('{1,2,3}', 2, 3){2}
rb_range_cardinalityroaringbitmap, range_start bigint, range_end bigintbigintReturn the count of elements in [range_start, range_end)rb_range_cardinality('{1,2,3}', 2, 3)1
rb_minroaringbitmapintegerReturn the smallest element, or NULL if emptyrb_min('{1,2,3}')1
rb_maxroaringbitmapintegerReturn the largest element, or NULL if emptyrb_max('{1,2,3}')3
rb_rankroaringbitmap, integerbigintReturn the count of elements less than or equal to the given valuerb_rank('{1,2,3}', 3)3
rb_jaccard_distroaringbitmap, roaringbitmapdouble precisionReturn the Jaccard distance (Jaccard similarity coefficient)rb_jaccard_dist('{1,2,3}', '{3,4}')0.25
rb_selectroaringbitmap, bitset_limit bigint, bitset_offset bigint=0, reverse boolean=false, range_start bigint=0, range_end bigint=4294967296roaringbitmapReturn the subset at positions [bitset_offset, bitset_offset+bitset_limit) within [range_start, range_end)rb_select('{1,2,3,4,5,6,7,8,9}', 5, 2){3,4,5,6,7}
rb_to_arrayroaringbitmapinteger[]Convert to an integer arrayrb_to_array(roaringbitmap('{1,2,3}')){1,2,3}
rb_iterateroaringbitmapSET of integerReturn each element as a rowSELECT rb_iterate(rb_build('{1,2,3}'))1, 2, 3

Aggregate functions

FunctionInputOutputDescriptionExampleResult
rb_build_aggintegerroaringbitmapBuild a bitmap from a set of integersSELECT rb_build_agg(id) FROM (VALUES (1),(2),(3)) t(id){1,2,3}
rb_or_aggroaringbitmaproaringbitmapOR aggregateSELECT rb_or_agg(bitmap) FROM (VALUES (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}'))) t(bitmap){1,2,3,4}
rb_and_aggroaringbitmaproaringbitmapAND aggregateSELECT rb_and_agg(bitmap) FROM (VALUES (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}'))) t(bitmap){2,3}
rb_xor_aggroaringbitmaproaringbitmapXOR aggregateSELECT rb_xor_agg(bitmap) FROM (VALUES (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}'))) t(bitmap){1,4}
rb_or_cardinality_aggroaringbitmapbigintOR aggregate, return cardinalitySELECT rb_or_cardinality_agg(bitmap) FROM (VALUES (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}'))) t(bitmap)4
rb_and_cardinality_aggroaringbitmapbigintAND aggregate, return cardinalitySELECT rb_and_cardinality_agg(bitmap) FROM (VALUES (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}'))) t(bitmap)2
rb_xor_cardinality_aggroaringbitmapbigintXOR aggregate, return cardinalitySELECT rb_xor_cardinality_agg(bitmap) FROM (VALUES (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}'))) t(bitmap)2