在数据库中存储数千万条记录的最佳选择是什么?

时间:2020-05-09 19:35:38

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

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

2 个答案:

答案 0 :(得分:1)

这个问题可能会被标记,但是我还是给你一个答案:

ActiveRecord不一定很慢。 ActiveModel很慢。

ActiveModel是将您的结果集和数据库类型映射到一个红宝石友好的对象中,以及将您的数据(字符串形式的东西)并将其转换为数据库类型以进行插入/更新的对象。

如果要渲染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是一个不错的起点。

答案 1 :(得分:1)

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

如果由于某些原因您不想使用COPY而希望使用INSERT行,那么在{{1} },然后在每行插入后提交-类似于:

SET AUTOCOMMIT TO OFF

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

如果可以(并且很安全)在文件中准备好数据(不确定在DB为下一行准备就绪而又不使事情复杂化时,如何确保可以准备插入数据)。< / p>

PG对于此类问题有一个guidethese answers上也有更多信息。

相关问题