首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >postgres如何处理位数据类型?

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

Stack Overflow用户
提问于 2013-01-08 15:18:35
回答 2查看 5.1K关注 0票数 2

我有一个表,其列向量为位(2000)。数据库引擎如何处理操作和对此值的OR?它是简单地划分为32位块(或分别为64块),然后分别比较每个块,最后简单地将结果连接在一起吗?还是简单地作为两个字符串处理?

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

代码语言:javascript
复制
userID | itemID
U1     | I1
U1     | Ix
Un     | Ij

对于每个用户,我想要计算n个最近邻居的列表(例如,使用jaccard指数 )。

代码语言:javascript
复制
select my_jaccard(select itemID from table where userID=U1,select itemID from table where userID=U2)

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

代码语言:javascript
复制
userID | vector
U1     | 00.......01
U1     | 0..1.....00
Un     | 00..1..1..0

在这张桌子上我很简单

代码语言:javascript
复制
select vector1&vector2

要点是,每个用户最多只有10条记录用于所有项目,即向量的最大活动位数为10。我认为,解析整个位向量仅仅是为了找到活动位需要更多的计算资源,而不是简单地将user1的10个值与user2的10个值进行比较。

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

我使用psql v8.2和v9.x

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-08 17:04:11

位类型上的位操作在内部作为呃位操作来处理。例如,下面是"and“代码所做的工作:

代码语言:javascript
复制
p1 = VARBITS(arg1);
p2 = VARBITS(arg2);
r = VARBITS(result);
for (i = 0; i < VARBITBYTES(arg1); i++)
    *r++ = *p1++ & *p2++;

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

所以我觉得这个应该很快。

票数 5
EN

Stack Overflow用户

发布于 2013-01-08 17:04:17

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

摘录bit_and(),第1205至1209行

代码语言:javascript
复制
p1 = VARBITS(arg1);
p2 = VARBITS(arg2);
r = VARBITS(result);
for (i = 0; i < VARBITBYTES(arg1); i++)
    *r++ = *p1++ & *p2++;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14218170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档