数据库推荐

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 Server以处理此类查询?我也对列存储数据库(如MonetDB)和文档存储数据库(如MongoDB)感到好奇。是否有人有建议?

非常感谢, Brett


这些 a-columns 是从哪里来的? - sjngm
@Brett:我真的希望你没有真正意味着相等。看了你的更新,似乎你并没有这样做,幸运的是。 - Mark Byers
@Mark,好的,说得好。我没有那样想过。'a'值是在客户端生成的,并且每个查询都不同。 - Brett
@Brett:我觉得你所做的并不像是点积。Waleed Al-Balooshi建议的方法(我在我的更新答案中也提到了)对于你发布的查询是可行的,但对于点积则不适用。那么你需要的是哪一种呢? - Mark Byers
Brett 正如 Mark 所解释的那样,这不是一个点积。点积应该是 a1c1 + a2c2 + ... + a50c50。 - Waleed Al-Balooshi
显示剩余3条评论
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

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


+1 链接回收利用 :P - JNK
+1 我建议像我在主要问题中的评论中所做的那样,只发送'a'的总数,而不是50个单独的变量。假设他正在使用存储过程。 - Waleed Al-Balooshi
我喜欢这种方法(也感谢Waleed)。不过,关于PERSISTED列有一个快速问题。在我看来,这似乎与预先计算总和并在插入数据时添加此数据相同。我想PERSISTED列允许我在插入后修改“c”数据吗? - Brett
@Brett:是的,该列将自动与数据保持同步。如果您更新其中一个值,则持久化列中的值将自动更新。 - Mark Byers

2

如果您使用SQL Server:

如果您的查询中总是包含相同的计算(例如,同一字段加或减同一其他字段等),则可以创建带有持久化值的计算列。

目前,由于引擎在每行上运行复杂的数学运算,因此您的查询速度会很慢。

如果您添加了一个带有结果的列,则所有计算只需进行一次,然后运行查询将更快。


这里也+1。:) 但现在我对我们的答案是否正确有所怀疑。请看问题下面的评论。 - Mark Byers
@Mark Byers - 如果他对相同的“常量”运行多个查询,那么仍然会有巨大的改进。 - JNK

0

最好使用内存数据库。请查看http://hsqldb.org/

根据您有多少百万行...


0

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

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

您可以在数据库端预先计算 c = 1 + c1 + ... + c50 和客户端上的 a = a1 + ... + a50,然后将查询转换为 ... WHERE @a > c。这就打开了使用索引的机会。

然而,大多数数据库(包括 SQL Server)不支持对浮点数进行索引。如果我们能够对数据做出一些假设,也许我们可以解决这个问题。例如,如果像例子中那样仅将数字存储到两位小数,那么我们可以将所有数字乘以 100 转换为整数。然后,索引将起作用。当然,这取决于有多少行满足条件。即使是“数百万行”的一半仍然是很多行。

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


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