在 PostgreSQL 中存储位集?

Fra*_*eil 4 postgresql

我需要计算按不同标准分组的范围,并且希望将所有内容都保留在我的数据库中。我正在寻找 PostgreSQL 的预构建 bitset 实现,或者有关如何实现目标的指针。

我目前正在做的是将 EWAHCompressedBitSet 的序列化 Java 实例存储在 bytea 列中,但这意味着我必须往返于 Java 进程才能继续我的计算。

理想情况下,我希望能够执行以下操作:

-- Unique people reached during a time window
SELECT   service_name, last_updated_at, bitset_or(followers_bs)
FROM     followers
GROUP BY service_name, last_updated_at
Run Code Online (Sandbox Code Playgroud)

我使用了具有此类功能的商业解决方案(Truviso),它也是基于 PostgreSQL 的。

请注意,我确实有一个包含未压缩格式数据的表,但由于数据非常庞大(1000 万行并且还在计数),加入它所花费的时间比我想投入的时间要长。

pil*_*row 5

Can you use the "bit" type instead of "bytea", and use your own user-defined aggregate?

postgres=> CREATE AGGREGATE bitset_or ("bit")
postgres-> ( sfunc    = bitor,
postgres->   stype    = "bit",
postgres->   initcond =   '0'  );
Run Code Online (Sandbox Code Playgroud)

Now bitset_or should work with your query as written (again, assuming bytea -> bit).