SQL中的稀疏点积

时间:2009-06-29 20:47:58

标签: sql performance optimization query-optimization

想象一下,我有一个存储一系列稀疏向量的表。稀疏向量意味着它仅在数据结构中显式存储非零值。我可以有一个100万维向量,但我只存储非零的维度的值。因此,大小与非零条目的数量成正比,而不是向量的维数。

表定义如下: vector_id:int dimension:int value:float

现在,在正常的编程范围内,我可以计算O(| v1 | + | v2 |)时间内两个向量的内积或点积。基本上算法是存储按维度排序的稀疏向量并迭代每个维度,直到找到维度之间的碰撞并乘以共享维度的值并继续添加它们直到你到达任一个向量的末尾

在SQL中实现这一目标的最快方法是什么?

1 个答案:

答案 0 :(得分:5)

您应该能够在一个查询中复制此算法:

select sum(v1.value * v2.value)
from vectors v1
inner join vectors v2
on v1.dimension = v2.dimension
where v1.vector_id = ...
and v2.vector_id = ...