3

我有一组数据,如下所示:

id   name     c1    c2    c3    c4   ...  c50
-----------------------------------------------
1    string1  0.1   0.32  0.54 -1.2  ...  2.3
2    string2  0.12  0.12 -0.34  2.45 ...  1.3
...
(millions of records)

所以我有一个 id 列,一个字符串列,然后是 50 个浮点列。

在传统 SQL SELECT 语句中,只有一种类型的查询会在此数据上运行,如下所示:

SELECT name FROM table WHERE ((a1-c1)+(a2-c2)+(a3-c3)+...+(a50-c50)) > 1;其中a1,a2,a3,etc是在发送查询之前生成的值(不包含在数据表中)。

我的问题是:对于哪种类型的数据库可以最快地处理此类查询,是否有人有任何建议。 我用过SQL server(主要是慢),所以我正在寻找其他意见。

有没有办法为这种类型的查询优化 SQL 服务器?我也对列存储数据库(例如MonetDB. 或者可能是一个文档存储数据库,例如MongoDB. 有没有人有什么建议?

非常感谢,布雷特

4

4 回答 4

10

您可以继续使用 SQL Server 并使用持久计算列来计算所有值的总和并为其编制索引。

ALTER TABLE tablename ADD SumOfAllColumns AS (c1 + c2 + ... + c50) PERSISTED

然后,您可以将查询重新排列为:

SELECT name FROM tablename WHERE SumOfAllColumns < a1+a2+a3+...+a50 - 1

此查询将能够使用计算列上的索引,并且应该快速找到相关行。

于 2010-12-29T20:07:17.787 回答
2

坚持使用 SQL Server:

如果您始终在查询中包含相同的计算(相同的字段 + 或 - 相同的其他字段等),您可以创建具有持久值的计算列。

目前,您的查询会很慢,因为引擎正在为每一行运行复杂的数学运算。

如果您在结果中添加一列,则数学运算全部完成一次,然后运行查询会快得多。

于 2010-12-29T20:07:04.363 回答
0

内存数据库是最好的。看看http://hsqldb.org/

取决于你有多少百万行......

于 2010-12-29T20:05:22.300 回答
0

您的查询条件可以重写为:

(a1 + a2 + a3 + ... + a50) > 1 + (c1 + c2 + c3 + ... + c50)

c = 1 + c1 + ... + c50您可以在数据库端和a = a1 + ... + a50客户端进行预计算。然后查询减少到... WHERE @a > c。这为使用索引打开了机会。

但是,浮点数在大多数数据库(包括 SQL Server)中都不能很好地索引。如果我们可以对数据做出一些假设,我们也许可以解决这个问题。例如,如果数字只存储到示例中的两位精度,那么我们可以将所有数字乘以 100 以获得整数。然后,索引将运行良好。合理的好,就是……这取决于有多少行满足条件。“数百万行”的一半仍然是很多行。

即使这些值具有真正可变的精度,因此两位数不够准确,创建整数索引以减少需要检查的行仍然可能有意义。查询可以检查近似值(命中索引)和精确值(获得精确结果)。如果这样做,请确保原始值在正确的方向上四舍五入,以避免丢失精确的结果。

于 2010-12-29T20:45:29.497 回答