金仓数据库KingbaseES Bitmapset
关键字:
KingbaseES、Bitmapset、人大金仓、KingbaseES
什么是Bitmapset
在Kingbase中,Bitmapset(位图集)是一个重要且高效的数据结构,它可以用于表示一组数值唯一的整数值,并提供了一系列集合操作来对这些值进行高效的管理。
Bitmapset内部基于位图,使用一个位数组来表示整数的集合,如果某一位被设置为1,则表示该整数包含于集合中,如下表所示:
十进制DEC | 二进制位图BIN | 集合中的数 |
64 | 0100,0000 | 6 |
40 | 0010,1000 | 3,5 |
24 | 0001,0100 | 2,4 |
Bitmapset的结构
typedef struct Bitmapset
{
int nwords;;
bitmapword words[FLEXIBLE_ARRAY_MEMBER];;
} Bitmapset;;
Bitmapset的数据结构如上图所示,nword表示在这个集合中有几个元素,words是记录集合中元素的位图,由柔性数组实现,。
Bitmapset的使用
在Kingbase中使用Bitmapset前,常用kes_alloc进行申请。
Bitmapset相关操作的函数都在文件bitmpa_set.c中,常用的有以下几种:
函数名 | 参数列表 | 说明 |
bms_equal | Bitmapset *, Bitmapset * | 比较两位图集逻辑上是否相等 |
bms_copy | Bitmapset * | 生成位图集的palloc副本 |
bms_free | Bitmapset * | 释放位图集 |
bms_union | Bitmapset *, Bitmapset * | 取两位图集的合集 |
bms_difference | Bitmapset *A, Bitmapset *B | 计算集合差异(A没有B的成员) |
bms_intersect | Bitmapset *, Bitmapset * | 取两位图集的交集 |
bms_is_subset | Bitmapset *A, Bitmapset *B | A是B的子集吗 |
bms_is_member | int, Bitmapset * | 某值是否属于集合 |
bms_is_empty | Bitmapset * | 集合是否为空 |
bms_add_member | Bitmapset *,int | 集合添加成员 |
bmd_del_member | Bitmapset *,int | 删除集合中的成员 |




