【问题标题】:What are the best options to store tens of millions of records in a database? [closed]在数据库中存储数千万条记录的最佳选择是什么? [关闭]
【发布时间】:2020-05-09 19:35:38
【问题描述】:

我正在为某位交易员工作,他想建立一个相对庞大的股票报价档案以供进一步分析。我们可以访问信息提供者,并且数据始终具有相同的结构:代码名称、时间戳和 OHLC,因此它适合关系数据库方法。 到目前为止,我使用 Ruby on Rails(Ruby 2.6、Rails 6.0)和 PostgreSQL 制作了一个工作原型。它可以非常快地从提供者那里获取数据,但是将数百万条记录存储到数据库中非常慢。我从 ActiveRecord 样式切换到纯 SQL,它使速度提高了 3 倍,但存储少量所需数据仍然是一个非常长的过程。 所以我需要以某种方式提高原型的性能,但不知道该怎么做。我当然可以使用 Redis 之类的东西,但无论如何我都需要将数据存储到持久存储中。 我该怎么办?

【问题讨论】:

  • 您的问题非常广泛。我们不知道您的硬件环境、架构或您的专业知识,因此任何详细的答案都会导致写一本书。作为回报,我们只能给您广泛的答案,这不是 SO 方式。请查看“How to Ask”、“Stack Overflow question checklist”和所有它们的链接页面。

标签: ruby-on-rails ruby postgresql stock trading


【解决方案1】:

大多数 DBMS 支持您可以利用的BULK INSERT,或者更好的是您可以使用 PG 的COPY 命令,该命令针对加载大量行进行了优化。当然,这意味着编写原始 SQL。

如果由于某种原因您不想使用 COPY 而您更愿意使用 INSERT 您的行,那么在 PG 中使用 SET AUTOCOMMIT TO OFF 禁用自动提交然后在每已插入行——类似于以下内容:

BEGIN;

INSERT INTO table (column1, column2, …)
VALUES
    (value1, value2, …),
    (value1, value2, …) ,...;

COMMIT;

这里的想法是首先删除所有索引和外键约束(如果有的话),然后在完成后将它们放回去。这应该加快速度。

此外,如果您可以(并且它是安全的)在文件中准备好数据(不确定如何确保在数据库准备好下一行时可以插入数据而不会使事情复杂化)。

PG 有一个guide 来处理这样的事情。 these answers 也有更多信息。

【讨论】:

    【解决方案2】:

    这个问题可能会被标记,但无论如何我会给你一个答案:

    ActiveRecord 不一定很慢。 ActiveModel 很慢。

    ActiveModel 将您的结果集和数据库类型映射为对 ruby​​ 友好的对象,并将您的数据(字符串-y 的东西)转换为数据库类型以进行插入/更新。

    如果您要渲染 JSON,请确保您使用的是 C 渲染器 OJ 或类似的:https://github.com/ohler55/oj — 它对于更大的数据集和响应有很大的不同。

    如果您对作为可以循环遍历的哈希的结果集感到满意,则可以避免使用 connection#exec_query 访问 ActiveModel:

    stocks_query = Stock.all
    results = Stock.connection.exec_query(stocks_query.to_sql).to_a 
    
    results.each do |result|
      puts result 
    end
    

    如果您要插入数百万行,甚至更新数百万行,您可能应该使用正确的工具来完成这项工作:原始 SQL。但这会变得笨拙,而且你喜欢 ruby​​,所以你可以使用类似 https://github.com/zdennis/activerecord-import 这样的东西,它可以让你编写 ruby​​,它会处理剩下的事情。

    数千万条记录并不多。 PostgreSQL 可能是您最好的选择,而不会引入大量不必要的复杂性。您只需要知道使用 Rails 与数据库层通信的瓶颈,以及如何解决这些瓶颈。确保您的数据库也被正确索引。如果您不确定,https://github.com/plentz/lol_dba 是一个不错的起点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多