暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL roaringbitmap UID溢出(超出int4(32字节))时的处理方法 - offset

digoal 2020-01-10
1220

作者

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热门书籍等,奖品丰富,快来许愿。开不开森.

9.9元购买3个月阿里云RDS PostgreSQL实例

PostgreSQL 解决方案集合

德哥 / digoal's github - 公益是一辈子的事.

digoal's wechat

文章转载自digoal,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论