postgres如何处理位数据类型?

ulk*_*kas 2 postgresql vectorization data-mining computation

我有一个类型为bit(2000)的列向量的表.db引擎如何处理此值的操作ANDOR?它是否只是分成32位块(或分别为64位),然后分别比较每个块,最后简单地将结果连接在一起?还是只处理两个字符串?

我的观点是预测,哪个用例会更快.我得到了一个键值数据(用户项).

userID | itemID
U1     | I1
U1     | Ix
Un     | Ij
Run Code Online (Sandbox Code Playgroud)

对于每个用户,我想计算n个最近邻居的列表(例如,使用jaccard索引).

select my_jaccard(select itemID from table where userID=U1,select itemID from table where userID=U2)
Run Code Online (Sandbox Code Playgroud)

我的解决方案 - 我将输入数据解析为用户向量表,其中向量的类型为bit(2000),在表示特定项目的位置上有1.

userID | vector
U1     | 00.......01
U1     | 0..1.....00
Un     | 00..1..1..0
Run Code Online (Sandbox Code Playgroud)

我只是在这张桌子上

select vector1&vector2
Run Code Online (Sandbox Code Playgroud)

关键是每个用户最多只有10条记录用于所有项目,即向量最多有10个有效位.我认为,解析整个bitvector只是为了找到有效位需要更多的计算资源,而不是简单地将user1的10个值与user2的10个值相互比较.

是否更快地使用长位向量,这些位向量的位数设置为1,或者更好地将原始值用作集合并将两个集合在一起?(一套最多10件)

我同时使用psql v8.2和v9.x.

Pet*_*aut 5

位类型的位操作在内部处理为呃位操作.以下是"和"代码的作用,例如:

p1 = VARBITS(arg1);
p2 = VARBITS(arg2);
r = VARBITS(result);
for (i = 0; i < VARBITBYTES(arg1); i++)
    *r++ = *p1++ & *p2++;
Run Code Online (Sandbox Code Playgroud)

(所以它实际上是8位块.)

所以我觉得这应该很快.