迭代大型外部postgres db,操作行,将输出写入rails postgres db

时间:2014-07-10 23:55:45

标签: sql ruby-on-rails database postgresql

我有一个大约200,000,000行和6列的postgres DB。列具有int,date和string,但没有主键,也没有唯一值作为主键的基础。

此DB中的记录包含我的某个rails postgres模型所需的原始数据。我想迭代完整的外部数据库,对其每一行执行计算,然后将输出写入我的rails模型。

我没有问题连接到数据库或通过ActiveRecord访问记录,但我尝试迭代数据库的所有内容都失败或耗时太长。我尝试了以下内容:

  • ExternalDB.all.each
  • ExternalDB.find_all.each
  • 使用these instructions
  • 向ExternalDB添加“id”列

我认为答案是使用SQL进行迭代,但我甚至不确定如何开始。

2 个答案:

答案 0 :(得分:1)

Postgres 的角度来看:

您无需拥有唯一值即可拥有索引。 (确实有唯一索引,这是主键强制执行的内容,但这不是必需的。)

第一件事是让索引包含您将使用的搜索词。如果您要搜索您提到的所有6个值,那么您应该尝试在这6个值上创建索引

但是,根据查询的确切性质,它不一定能保证将使用该索引。它将部分取决于查询规划器认为将由查询返回多少行,这将反过来确定它是否尝试使用索引进行扫描或如果要进行顺序扫描

因此,一旦您创建了该索引,请尝试使用 psql PgAdmin SELECT,然后运行{{1}查看计划程序是否计划使用索引,然后运行它以查看它的执行情况。

如果它运行良好,那么您可以将其集成回 Rails 代码,可能是通过原始 SQL

答案 1 :(得分:1)

您需要使用光标,协议级别或an SQL-level cursor with DECLARE and FETCH

随便,someone already wrote an ActiveRecord adapter for PostgreSQL cursors;见rubygems

您可能还会发现此问题内容丰富:Are there any Ruby ORMs which use cursors or smart fetch?

我还没有检查源代码/文档以查看Pg gem是否支持PostgreSQL的批量读取的协议级游标,但是如果已经有了一个工具来执行它(如以上链接)它可能不值得探索。