pg_roaringbitmap(压缩位图)

RoaringBitmap是一种压缩位图,其性能优于WAH、EWAH、Concise等传统压缩位图。在特定场景下,RoaringBitmap可以在提供良好压缩性能的条件下,仍然具备快于传统压缩位图近百倍的索引性能,甚至性能可以超过未采用压缩的位图。

创建插件

CREATE EXTENSION if NOT EXISTS roaringbitmap;

创建插件成功后可通过以下SQL语句查看版本:

SELECT extname,extversion FROM pg_extension WHERE extname = 'roaringbitmap';

返回结果如下:

    extname    | extversion 
---------------+------------
 roaringbitmap | 0.5
(1 row)

输入和输出格式

PolarDB目前仅支持arraybytea两种输入输出格式。

  • 输入格式

    • array

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

      SELECT '\x3a30000001000000000002001000000001000a006400'::roaringbitmap;
                       roaringbitmap                  
      ------------------------------------------------
       \x3a30000001000000000002001000000001000a006400
      (1 row)
  • 输出格式

    说明

    输出格式默认为bytea,您可以通过roaringbitmap.output_format修改输出格式。

    • 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)

使用说明

输入和输出格式

PolarDB目前仅支持arraybytea两种输入输出格式。

  • 输入格式

    • array

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

      SELECT '\x3a30000001000000000002001000000001000a006400'::roaringbitmap;
                       roaringbitmap                  
      ------------------------------------------------
       \x3a30000001000000000002001000000001000a006400
      (1 row)
  • 输出格式

    说明

    输出格式默认为bytea,您可以通过roaringbitmap.output_format修改输出格式。

    • 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)

创建表

CREATE TABLE t1 (id integer, bitmap roaringbitmap);

整数集合创建位图

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;

位图计算函数

位图计算函数包含OR、AND、XOR、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}');

位图聚合函数

位图聚合函数包含OR、AND、XOR、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;

位图基数计算函数

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

位图转换整数集合

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

位图转换整数

支持以下两种方式将位图转换为整数。

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

操作列表

操作符

输入

输出

描述

示例

结果

&

roaringbitmap,roaringbitmap

roaringbitmap

位元且运算。

roaringbitmap('{1,2,3}') & roaringbitmap('{3,4,5}')

{3}

|

roaringbitmap,roaringbitmap

roaringbitmap

位元或运算。

roaringbitmap('{1,2,3}') | roaringbitmap('{3,4,5}')

{1,2,3,4,5}

|

roaringbitmap,integer

roaringbitmap

将元素添加到RoaringBitmap中。

roaringbitmap('{1,2,3}') | 6

{1,2,3,6}

|

integer,roaringbitmap

roaringbitmap

将元素添加到RoaringBitmap中。

6 | roaringbitmap('{1,2,3}')

{1,2,3,6}

#

roaringbitmap,roaringbitmap

roaringbitmap

位元互斥或运算。

roaringbitmap('{1,2,3}') # roaringbitmap('{3,4,5}')

{1,2,4,5}

<<

roaringbitmap,bigint

roaringbitmap

按位左移。

roaringbitmap('{1,2,3}') << 2

{0,1}

>>

roaringbitmap,bigint

roaringbitmap

按位右移。

roaringbitmap('{1,2,3}') >> 3

{4,5,6}

-

roaringbitmap,roaringbitmap

roaringbitmap

差异。

roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}')

{1,2}

-

roaringbitmap,integer

roaringbitmap

从RoaringBitmap中删除元素。

roaringbitmap('{1,2,3}') - 3

{1,2}

@>

roaringbitmap,roaringbitmap

bool

包含。

roaringbitmap('{1,2,3}') @> roaringbitmap('{3,4,5}')

f

@>

roaringbitmap,integer

bool

包含。

roaringbitmap('{1,2,3,4,5}') @> 3

t

roaringbitmap,roaringbitmap

bool

包含。

roaringbitmap('{1,2,3}') @> 4

f

integer,roaringbitmap

bool

包含。

3 @> roaringbitmap('{1,2,3,4,5}')

t

&&

roaringbitmap,roaringbitmap

bool

重叠。

roaringbitmap('{1,2,3}') && roaringbitmap('{3,4,5}')

t

=

roaringbitmap,roaringbitmap

bool

等于。

roaringbitmap('{1,2,3}') = roaringbitmap('{3,4,5}')

f

<>

roaringbitmap,roaringbitmap

bool

不等于。

roaringbitmap('{1,2,3}') <> roaringbitmap('{3,4,5}')

t

功能函数列表

函数

输入

输出

描述

示例

结果

rb_build

integer[]

roaringbitmap

Create roaringbitmap from integer array

rb_build('{1,2,3,4,5}')

{1,2,3,4,5}

rb_index

roaringbitmap,integer

bigint

Return the 0-based index of element in this roaringbitmap, or -1 if do not exsits

rb_index('{1,2,3}',3)

2

rb_cardinality

roaringbitmap

bigint

Return cardinality of the roaringbitmap

rb_cardinality('{1,2,3,4,5}')

5

rb_and_cardinality

roaringbitmap,roaringbitmap

bigint

Return cardinality of the AND of two roaringbitmaps

rb_and_cardinality('{1,2,3}',rb_build('{3,4,5}'))

1

rb_or_cardinality

roaringbitmap,roaringbitmap

bigint

Return cardinality of the OR of two roaringbitmaps

rb_or_cardinality('{1,2,3}','{3,4,5}')

5

rb_xor_cardinality

roaringbitmap,roaringbitmap

bigint

Return cardinality of the XOR of two roaringbitmaps

rb_xor_cardinality('{1,2,3}','{3,4,5}')

4

rb_andnot_cardinality

roaringbitmap,roaringbitmap

bigint

Return cardinality of the ANDNOT of two roaringbitmaps

rb_andnot_cardinality('{1,2,3}','{3,4,5}')

2

rb_is_empty

roaringbitmap

boolean

Check if roaringbitmap is empty.

rb_is_empty('{1,2,3,4,5}')

f

rb_fill

roaringbitmap,range_start bigint,range_end bigint

roaringbitmap

Fill the specified range (not include the range_end)

rb_fill('{1,2,3}',5,7)

{1,2,3,5,6}

rb_clear

roaringbitmap,range_start bigint,range_end bigint

roaringbitmap

Clear the specified range (not include the range_end)

rb_clear('{1,2,3}',2,3)

{1,3}

rb_flip

roaringbitmap,range_start bigint,range_end bigint

roaringbitmap

Negative the specified range (not include the 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

Return new set with specified range (not include the range_end)

rb_range('{1,2,3}',2,3)

{2}

rb_range_cardinality

roaringbitmap,range_start bigint,range_end bigint

bigint

Return the cardinality of specified range (not include the range_end)

rb_range_cardinality('{1,2,3}',2,3)

1

rb_min

roaringbitmap

integer

Return the smallest offset in roaringbitmap. Return NULL if the bitmap is empty

rb_min('{1,2,3}')

1

rb_max

roaringbitmap

integer

Return the greatest offset in roaringbitmap. Return NULL if the bitmap is empty

rb_max('{1,2,3}')

3

rb_rank

roaringbitmap,integer

bigint

Return the number of elements that are smaller or equal to the specified offset

rb_rank('{1,2,3}',3)

3

rb_jaccard_dist

roaringbitmap,roaringbitmap

double precision

Return the jaccard distance(or the Jaccard similarity coefficient) of two bitmaps

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

Return subset [bitset_offset,bitset_offset+bitset_limit) of bitmap between range [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[]

Convert roaringbitmap to integer array

rb_to_array(roaringbitmap('{1,2,3}'))

{1,2,3}

rb_iterate

roaringbitmap

SET of integer

Return set of integer from a roaringbitmap data.

SELECT rb_iterate (rb_build('{1,2,3}'))

123

聚合函数列表

函数

输入

输出

描述

示例

结果

rb_build_agg

integer

roaringbitmap

Build a roaringbitmap from a integer set

select rb_build_agg(id) from (values (1),(2),(3)) t(id)

{1,2,3}

rb_or_agg

roaringbitmap

roaringbitmap

AND Aggregate calculations from a roaringbitmap set

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

AND Aggregate calculations from a roaringbitmap set

select rb_and_agg(bitmap) from (values (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}')) ) t(bitmap)

{2,3}

rb_xor_agg

roaringbitmap

roaringbitmap

XOR Aggregate calculations from a roaringbitmap set

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

OR Aggregate calculations from a roaringbitmap set, return cardinality.

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

AND Aggregate calculations from a roaringbitmap set, return cardinality

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

XOR Aggregate calculations from a roaringbitmap set, return cardinality

select rb_xor_cardinality_agg(bitmap) from (values (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}')) ) t(bitmap)

2