Sql 数据库推荐
我收集的数据如下所示:Sql 数据库推荐,sql,sql-server,mongodb,monetdb,database,Sql,Sql Server,Mongodb,Monetdb,Database,我收集的数据如下所示: 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个浮点列
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语句中是这样的:
从表中选择名称,其中((a1-c1)+(a2-c2)+(a3-c3)+…+(a50-c50))>1
其中a1、a2、a3等
是在发送查询之前生成的值(不包含在数据表中)
我的问题是:有没有人对哪种类型的数据库处理这类查询最快有什么建议。我使用过SQL server
(速度非常慢),所以我在寻找其他意见
有没有办法为这种类型的查询优化SQL server?我对列存储数据库也很好奇,比如MonetDB
。或者是文档存储数据库,如MongoDB
。有人有什么建议吗
非常感谢,,
Brett内存中的数据库最好。看看
取决于要使用SQL Server的行数有多少…: 如果在查询中始终包含相同的计算(相同的字段+或-相同的其他字段等),则可以创建 目前,您的查询速度会很慢,因为引擎正在为每一行运行复杂的数学运算
如果您添加一个包含结果的列,则所有计算都会完成一次,然后运行查询会快得多。您可以继续使用SQL Server,并使用计算所有值和该值的索引之和的
ALTER TABLE tablename ADD SumOfAllColumns AS (c1 + c2 + ... + c50) PERSISTED
然后,您可以将查询重新排列为:
SELECT name FROM tablename WHERE SumOfAllColumns < a1+a2+a3+...+a50 - 1
从tablename中选择名称,其中SumOfAllColumns
此查询将能够使用计算列上的索引,并应能快速找到相关行。您的查询条件可以重写为:
(a1 + a2 + a3 + ... + a50) > 1 + (c1 + c2 + c3 + ... + c50)
您可以预计算c=1+c1+…+数据库端的c50和a=a1+…+客户端的a50
。然后,查询将缩减为。。。其中@a>c
。这为使用索引提供了机会
但是,在大多数数据库(包括SQL Server)中,浮点数并不能很好地索引。如果我们能对数据做出一些假设,我们也许能够解决这个问题。例如,如果数字仅存储为两位精度,如示例中所示,则我们可以将所有数字乘以100以获得整数。然后,索引将很好地工作。相当不错,就是。。。这取决于满足条件的行数。“数百万行”中的一半仍然是很多行
即使这些值具有真正可变的精度,因此两位数字不够精确,创建整数索引以减少需要检查的行仍然是有意义的。查询可以检查近似值(以命中索引)和精确值(以获得精确结果)。如果这样做,请确保原始值按正确方向四舍五入,以避免丢失精确结果。这些a列来自何处?@Mark,谢谢,我刚刚忘记了等式。我纠正了这个问题;)@在sjngm中,“a”数据是在发送SELECT语句之前在客户端生成的。所以从实用的角度来看,它们都是常量。@Brett:我真的希望你实际上不是指平等。看着你的更新,幸运的是你似乎没有更新。@Mark,好的,说得好。我没有那样想过。“a”值是客户端生成的,每个查询都不同。+1用于链接回收:P+1我建议,正如我在主要问题的评论中所做的那样,只发送a的总数,而不是50个单独的变量。假设他使用的是存储过程,就像这种方法(也要感谢Waleed)。但是,关于持久化列的快速问题。在我看来,这与预先计算总和并在插入数据时添加数据是一样的。我想持久化列允许我在插入后修改“c”数据???@Brett:是的,该列将自动与数据保持同步。如果您更新其中一个值,则持久化列中的值将自动更新。+1此处也是。:)但现在我怀疑我们的答案是否正确。请参阅问题的注释。@Mark Byers-如果他对同一组“常量”运行多个查询,那么这仍然是一个巨大的改进。