作者
digoal
日期
2020-01-10
标签
PostgreSQL , pg_roaringbitmap , offset , int4 , int8 , 转换
背景
pg_roaringbitmap是PG的bitmap扩展包,广泛应用于精准广告营销,用户圈选的场景,bitmap内部每个值使用2个比特位,输入输出采用int4数组,所以会有一个问题,如果我们的结构如下:
create table t_tag_userids (
tagid int,
uidbitmaps roaringbitmap
);
uidbitmaps能存储的uid范围是40亿,如果你的uid已经超出了40亿,怎么办?可以对ID进行转换,将一个int8的值转换为offset,int4两个值。
```
source_uid_int8
x = (2^31)::int8 # int4 最大值 + 1
转换为2个部分如下:
target_uid_int4 = mod(source_uid_int8, x)
offset = source_uid_int8/x
```
还原为int8
source_uid_int8 = offset * x + target_uid_int4
例子
85899345992381 转换如下 :
```
target_uid_int4 = mod(85899345992381::int8, (2^31)::int8) = 72381
offset = 85899345992381::int8 / (2^31)::int8 = 40000
```
还原如下:
40000 * (2^31)::int8 + 72381 = 85899345992381
参考
《画像系统标准化设计 - PostgreSQL roaringbitmap, varbitx , 正向关系, 反向关系, 圈选, 相似扩选(向量相似扩选)》
《PostgreSQL pg_roaringbitmap - 用户画像、标签、高效检索》
PostgreSQL 许愿链接
您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.