【问题标题】:Database recommendation [closed]数据库推荐[关闭]
【发布时间】:2011-06-01 05:45:27
【问题描述】:

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

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。有人有什么建议吗?

非常感谢, 布雷特

【问题讨论】:

  • 这些 a 列从何而来?
  • @Mark,谢谢,我只是忘记了平等。我纠正了这个问题;)
  • @sjngm, 'a' 数据是在发送 SELECT 语句之前在客户端生成的。因此,出于所有实际目的,它们都是常量。
  • @Brett:我真的希望你的意思不是平等。幸运的是,看看您的更新,您似乎没有。
  • @Mark,好的,好点。我没有那样想。 'a' 值是在客户端生成的,并且对于每个查询都是不同的。

标签: sql sql-server mongodb monetdb database


【解决方案1】:

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

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

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

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

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

【讨论】:

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

你的查询条件可以改写为:

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

您可以在数据库端预计算c = 1 + c1 + ... + c50,在客户端预计算a = a1 + ... + a50。然后查询减少到... WHERE @a &gt; c。这开启了使用索引的机会。

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

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

【讨论】:

    【解决方案3】:

    坚持使用 SQL Server:

    如果您始终在查询中包含相同的计算(相同的字段 + 或 - 相同的其他字段等),您可以创建 computed columns with persisted values.

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

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

    【讨论】:

    • 这里也是+1。 :) 但现在我怀疑我们的答案是否正确。请参阅问题的 cmets。
    • @Mark Byers - 如果他对同一组“常量”运行多个查询,那么它仍然是一个巨大的改进。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-21
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      相关资源
      最近更新 更多