更新时间:2025-12-17 GMT+08:00
分享

Roaring Bitmap操作符

8.1.3集群版本开始,DWS支持高效的位图处理操作符,位图操作符在数据库中用于高效地进行集合运算,如交集、并集、差集和异或,通过合理使用位图操作符,可以显著提升数据库的处理效率,满足各种复杂的数据处理需求。适用于需要频繁进行集合运算的场景,如数据挖掘、机器学习中的特征工程,以及需要快速数据筛选和聚合的场景。

  • 9.1.1.100集群版本开始支持64位整数的位图。
  • 9.1.1.100集群版本中的|、-、@>、<@位图操作符,使用bigint作为输入时,不支持使用nvarchar2类型直接作为bigint输入,需要使用::bigint操作进行数据类型强转换。例如:
select '2022'::nvarchar2::bigint | '\x3a300000010000000000020010000000010002000300'::roaringbitmap;
                      ?column?                      
----------------------------------------------------
 \x3a300000010000000000030010000000010002000300e607
  • 9.1.1.200及以上集群版本中支持使用nvarchar2类型直接作为bigint输入,无需再进行强转换。
表1 Roaring Bitmap操作符列表

操作符

描述

返回值类型

示例

=

比较两个roaringbitmap是否相等。

bool

两个位图完全相同,返回t,表示它们相等。

1
2
3
4
5
SELECT rb_build('{1,2,3}') = rb_build('{1,2,3}');
?column?
----------
t
(1 row)

两个位图包含的元素不同,返回f,表示它们不相等。

1
2
3
4
5
SELECT rb_build('{2,3}') = rb_build('{1,2,3}');
?column?
----------
f
(1 row)

<>

比较两个roaringbitmap是否不相等。

bool

两个位图完全相同,返回f,表示它们相等。

1
2
3
4
5
SELECT rb_build('{1,2,3}') <> rb_build('{1,2,3}');
?column?
----------
f
(1 row)

两个位图包含的元素不同,返回t,表示它们不相等

1
2
3
4
5
SELECT rb_build('{2,3}') <> rb_build('{1,2,3}');
?column?
----------
t
(1 row)

&

计算两个roaringbitmap交集以后的结果。

roaringbitmap

将两个位图交集后的结果,返回共同元素{2,3}。

1
2
3
4
5
SELECT rb_to_array(rb_build('{2,3}') & rb_build('{1,2,3}'));
rb_to_array
-------------
{2,3}
(1 row)

|

计算两个roaringbitmap并集后的结果。

roaringbitmap

计算两个位图的并集结果,返回所有不重复的元素{1,2,3}。

1
2
3
4
5
SELECT rb_to_array(rb_build('{2,3}') | rb_build('{1,2,3}'));
rb_to_array
-------------
{1,2,3}
(1 row)

|

计算一个roaringbitmap增加一个元素后的结果。

roaringbitmap

计算包含元素{2,3}的位图添加元素4后的结果,返回{2,3,4}。

1
2
3
4
5
SELECT rb_to_array(rb_build('{2,3}') | 4);
rb_to_array
-------------
{2,3,4}
(1 row)

#

计算两个roaringbitmap进行异或后的结果。

roaringbitmap

计算两个位图的异或,返回两个集合中不相同的元素结果{1}。

1
2
3
4
5
SELECT rb_to_array(rb_build('{2,3}') # rb_build('{1,2,3}'));
rb_to_array
-------------
{1}
(1 row)

-

计算属于第一个roaringbitmap,但是不属于第二个roaringbitmap的结果集。

roaringbitmap

计算属于第一个位图{2,3,4}的元素,但这些元素不在第二个位图{1,2,3}中,返回结果 {4} ,表示元素4只在第一个位图。

1
2
3
4
5
SELECT rb_to_array(rb_build('{2,3,4}') - rb_build('{1,2,3}'));
rb_to_array
-------------
{4}
(1 row)

-

从roaringbitmap中去掉一个指定ID后的结果集。

roaringbitmap

从位图{2,3,4}中去掉一个指定元素3,返回结果集{2,4}。

1
2
3
4
5
SELECT rb_to_array(rb_build('{2,3,4}') - 3);
rb_to_array
-------------
{2,4}
(1 row)

@>

操作符前面的roaringbitmap是否包含后面的roaringbitmap。

bool

判断操作符@>前面的位图{2,3,4}是否包含后面的位图{2,3},返回t,表示包含。

1
2
3
4
5
SELECT rb_build('{2,3,4}') @> rb_build('{2,3}');
?column?
----------
t
(1 row)

判断操作符@>前面的位图{2,3,4}是否包含后面的位图5,返回f,表示不包含。

1
2
3
4
5
SELECT rb_build('{2,3,4}') @> 5;
?column?
----------
f
(1 row)

<@

操作符前面的roaringbitmap是否被后面的roaringbitmap包含。

bool

判断操作符<@前面的4是否被后面的位图{2,3,4}包含,返回t,表示包含。

1
2
3
4
5
SELECT  4 <@ rb_build('{2,3,4}');
?column?
----------
t
(1 row)

判断操作符<@前面的位图{2,3,4}是否被后面的位图{2,3}包含,返回f,表示不包含。

1
2
3
4
5
SELECT rb_build('{2,3,4}') <@ rb_build('{2,3}');
?column?
----------
f
(1 row)

&&

两个roaringbitmap如果有交集返回true,否则返回false。

bool

判断两个位图是否有交集,返回t,表示存在交集{2,3}

1
2
3
4
5
SELECT rb_build('{2,3,4}') && rb_build('{2,3}');
?column?
----------
t
(1 row)

判断两个位图是否有交集,返回f,表示不存在任何交集。

1
2
3
4
5
SELECT rb_build('{2,3,4}') && rb_build('{7,8,9}');
?column?
----------
f
(1 row)

相关文档