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

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

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

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

  • ExternalDB.all.each
  • ExternalDB.find_all.each
  • 使用这些说明向ExternalDB添加“id”列

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

您将需要使用游标,协议级别的游标或带有DECLAREFETCH的SQL级别游标 。

很简单, 有人已经为PostgreSQL游标编写了一个ActiveRecord适配器 ; 看看rubygems 。

您可能还会发现此问题内容丰富: 是否有使用游标或智能提取的Ruby ORM?

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

Postgres的角度来看:

您不需要具有唯一值即可获得索引 。 (确实存在唯一索引 ,这是主键强制执行的操作,但这不是必需的。)

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

但是,根据查询的确切性质,它不一定能保证将使用该索引。 它将部分取决于查询计划程序认为将由查询返回多少行,这将依次确定它是否尝试使用索引进行扫描,或者是否进行顺序扫描

因此,一旦您创建了该索引,请在psqlPgAdmin中尝试使用您想要使用的SELECT ,并在其上运行EXPLAIN以查看查询计划程序是否计划使用该索引 ,然后运行它以查看如何它执行。

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