我有一个表,其列向量为位(2000)。数据库引擎如何处理操作和对此值的OR?它是简单地划分为32位块(或分别为64块),然后分别比较每个块,最后简单地将结果连接在一起吗?还是简单地作为两个字符串处理?
我的重点是预测,哪种用例会更快。我得到了一个键值数据(用户项)。
userID | itemID
U1 | I1
U1 | Ix
Un | Ij对于每个用户,我想要计算n个最近邻居的列表(例如,使用jaccard指数 )。
select my_jaccard(select itemID from table where userID=U1,select itemID from table where userID=U2)我的解决方案-我把输入数据解析成一个用户向量表,其中向量是位类型的(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
发布于 2013-01-08 17:04:11
位类型上的位操作在内部作为呃位操作来处理。例如,下面是"and“代码所做的工作:
p1 = VARBITS(arg1);
p2 = VARBITS(arg2);
r = VARBITS(result);
for (i = 0; i < VARBITBYTES(arg1); i++)
*r++ = *p1++ & *p2++;(所以它实际上是8位块。)
所以我觉得这个应该很快。
发布于 2013-01-08 17:04:17
源代码似乎是逐字节比较的.搜索PostgreSQL源代码中的"bit_and“和"bit_or”函数。(对于我来说,似乎没有一种直接链接到函数的自然方式。)
摘录bit_and(),第1205至1209行
p1 = VARBITS(arg1);
p2 = VARBITS(arg2);
r = VARBITS(result);
for (i = 0; i < VARBITBYTES(arg1); i++)
*r++ = *p1++ & *p2++;https://stackoverflow.com/questions/14218170
复制相似问题