Postgresql postgres如何处理位数据类型?

Postgresql postgres如何处理位数据类型?,postgresql,data-mining,vectorization,computation,Postgresql,Data Mining,Vectorization,Computation,我有一个表,它的列向量类型为bit(2000)。db引擎如何处理操作和/或此值?它是否简单地划分为32位块(或分别为64位),然后分别比较每个块,最后简单地将结果合并在一起?或者它只是作为两个字符串处理 我的观点是预测哪个用例会更快。我得到了一个键值数据(用户项) 对于每个用户,我希望计算n个最近邻居的列表(例如,使用) 我的解决方案——我将输入数据解析成一个用户向量表,其中的向量是bit(2000)类型,位置上的1表示特定项 userID | vector U1 | 00.......

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

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

对于每个用户,我希望计算n个最近邻居的列表(例如,使用)

我的解决方案——我将输入数据解析成一个用户向量表,其中的向量是bit(2000)类型,位置上的1表示特定项

userID | vector
U1     | 00.......01
U1     | 0..1.....00
Un     | 00..1..1..0
在这张桌子上,我就这么做了

select vector1&vector2
关键是每个用户对于所有项最多只有10条记录,即向量最多有10个活动位。我认为,解析整个位向量只是为了找到活动位需要更多的计算资源,而不是简单地比较user1的10个值和user2的10个值

使用很少位设置为1的长位向量更快,还是使用原始值作为一个集合并将两个集合进行比较更好?(一套最多有10项)


我同时使用psql v8.2和v9.x,位类型上的位操作在内部作为,呃,位操作处理。下面是“and”代码的作用,例如:

p1 = VARBITS(arg1);
p2 = VARBITS(arg2);
r = VARBITS(result);
for (i = 0; i < VARBITBYTES(arg1); i++)
    *r++ = *p1++ & *p2++;
p1=VARBITS(arg1);
p2=变比特(arg2);
r=可变位(结果);
对于(i=0;i
(所以它实际上是8位块。)


因此,我认为这应该非常快。

源代码似乎是逐字节比较的。搜索函数“bit_and”和“bit_or”。(对于我来说,似乎没有一种自然的方式直接链接到函数。)

摘自varbit.c第1205至1209行的位_和()

p1 = VARBITS(arg1);
p2 = VARBITS(arg2);
r = VARBITS(result);
for (i = 0; i < VARBITBYTES(arg1); i++)
    *r++ = *p1++ & *p2++;
p1=VARBITS(arg1);
p2=变比特(arg2);
r=可变位(结果);
对于(i=0;i
为什么要使用过时的v8.2?您需要在v9.x中指定
x
,才能声明Postgres版本。@ErwinBrandstetter:thx,计算是否取决于版本?我使用8.2,因为它是一个生产实例,我不能更改。v9.x可以是任何人,因为这是一个测试实例,我可以将其更改为适合本例的更好的版本。如果答案取决于版本,我需要知道它们的区别,那么让我们假设8-9的所有版本。X谢谢你的评论,我在下面将答案标记为已接受,你们两人提供了我需要的相同信息,但peter提前了6秒:)6秒?我责备康卡斯特。
p1 = VARBITS(arg1);
p2 = VARBITS(arg2);
r = VARBITS(result);
for (i = 0; i < VARBITBYTES(arg1); i++)
    *r++ = *p1++ & *p2++;
p1 = VARBITS(arg1);
p2 = VARBITS(arg2);
r = VARBITS(result);
for (i = 0; i < VARBITBYTES(arg1); i++)
    *r++ = *p1++ & *p2++;