SQL表中多列的点积

4
我希望将每行乘以一个特定的行,然后对每行的乘积求和(点积)。我的SQL表是名字和相关高维向量的列表。该表有1个字符串和1000个数字列。通常有几百万行。向量/数组中的每个浮点数都在新列中:
+--------+------+-------+------+---+--------+
|  NAME  | COL0 | COL1  | COL2 || COL999 |
+--------+------+-------+------+---+--------+
| TOPAZ  | 0.73 | 0.77  | 0.15 |   | 0.55   |
| GARDEN | 0.41 | 0.57  | 0.61 |   | 0.00   |
| HAVE   | 0.40 | 0.32  | 0.23 |   | 0.52   |
+--------+------+-------+------+---+--------+

在数组数学中,这只是一个简单的sum(table * row, axis=1)。这是一个很大的数组,如果它被写入C并存储在纯内存中,则执行需要几秒钟,因此速度非常重要。但现在它已经太大了,无法放在本地内存中,数据需要存储在SQL服务器中。我该如何以高效的方式计算table * GARDEN,以便我可以获得每行与GARDEN的点积(如下面的示例输出)?
+--------+------+-------+------+---+--------+------+
|  NAME  | COL0 | COL1  | COL2 || COL999 | DOT  |
+--------+------+-------+------+---+--------+------+
| TOPAZ  | 0.57 | 0.24  | 0.34 |   | 0.21   | 0.46 |
| GARDEN | 0.42 | 0.43  | 0.12 |   | 0.66   | 0.48 |
| HAVE   | 0.31 | 0.37  | 0.30 |   | 0.47   | 0.40 |
+--------+------+-------+------+---+--------+------+

许多感谢!

你使用的是哪种数据库管理系统? - PinnyM
我打算使用Amazon RDS,我相信这将限制我只能使用MySQL DB Engine和Oracle DB Engine。谢谢!@PinnyM - Chris
1个回答

1

结构如下:

select t.*,
       (t.col0 * garden.col0 +
        t.col1 * garden.col1 + . . .
        t.col999 * garden.col999
       ) as DOT
from t cross join
     (select t.*
      from t
      where name = 'GARDEN'
     ) garden;

这仍然不会特别快。在C#中的“几秒钟”可能需要很多分钟,除非您拥有并行硬件和可以利用它的良好SQL数据库。


1
谢谢!我得试一下这个。我很担心查询需要几分钟,因为向量化数学本身就需要几秒钟。MySQL或Oracle(我正在使用Amazon RDS)会尝试请求大量额外的内存来保存单个总和t.col0 * garden.col0(因此需要N * 2内存),还是会在进行过程中累加总和?后者的内存占用要小得多。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接