【问题标题】:Is a relational database well suited for vector calculations?关系数据库是否非常适合矢量计算?
【发布时间】:2009-08-26 16:19:56
【问题描述】:

基本表架构看起来像这样(我使用的是 MySQL BTW):

integer unsigned vector-id
integer unsigned fk-attribute-id
float attribute-value
primary key (vector-id,fk-attribute-id)

vector表示为表中具有相同vector-id

的多条记录

我需要用此表中存在的所有向量的点积(也是欧几里得距离)建立一个单独的表。所以,我需要一个如下所示的结果表:

integer unsigned fk-vector-id-a
integer unsigned fk-vector-id-b
float dot-product


...像这样的...

integer unsigned fk-vector-id-a
integer unsigned fk-vector-id-b
float euclidean-distance

产生我的结果的最佳查询结构是什么?

对于非常大的向量,关系数据库是解决这个问题的最佳方法,还是我应该在应用程序中内化向量并在那里进行计算?

【问题讨论】:

  • 不同的向量可以有不同的维度吗?或者两个具有相同维度的向量可以具有不同的属性集?即,一个可以有 3-D 属性 {长度、宽度、高度},而另一个有 {体重、年龄、颜色}
  • 因为显然做点积需要 2 个向量在同一个 N 空间中,不是吗?即维度必须相同。
  • 是的,向量可以是不同的维度,但点积中只包含属性的重叠。

标签: sql optimization math vector


【解决方案1】:
INSERT
INTO    dot_products
SELECT  v1.vector_id, v2.vector_id, SUM(v1.attribute_value * v2.attribute_value)
FROM    attributes v1
JOIN    attributes v2
ON      v2.attribute_id = v1.attribute_id
GROUP BY
        v1.vector_id, v2.vector_id

MySQL,这可以更快:

INSERT
INTO    dot_products
SELECT  v1.vector_id, v2.vector_id,
        (
        SELECT  SUM(va1.attribute_value * va2.attribute_value)
        FROM    attributes va1
        JOIN    attributes va2
        ON      va2.attribute_id = va1.attribute_id
        WHERE   va1.vector_id = v1.vector_id
                AND va2.vector_id = v2.vector_id
        )
FROM    vector v1
CROSS JOIN
        vector v2

【讨论】:

  • 这会起作用,但是查询的性能特征是什么?在大型向量表上完成 JOIN 需要一年时间吗?
  • @JR Lawhorne:如果您在(atttribute_id, vector_id) 上有一个索引,它很可能比将结果集拉入应用程序、构建新值并将它们插入回更快。
  • 我建议添加WHERE v1.vector_id < v2.vector_id 以避免计算所有点积两次。
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 2023-03-25
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多