Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库推荐_Sql_Sql Server_Mongodb_Monetdb_Database - Fatal编程技术网

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-如果他对同一组“常量”运行多个查询,那么这仍然是一个巨大的改进。