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 |
+--------+------+-------+------+---+--------+------+

非常感谢!

4

1 回答 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 数据库。

于 2013-09-11T16:02:56.337 回答