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

Sql 迭代大型外部postgres db,操作行,将输出写入rails postgres db,sql,ruby-on-rails,database,postgresql,Sql,Ruby On Rails,Database,Postgresql,我有一个postgres数据库,大约有200000000行和6列。这些列有int、date和string,但没有主键,也没有唯一的值作为主键的基础 这个数据库中的记录包含我的一个rails postgres模型所需的原始数据。我希望遍历完整的外部数据库,对其中的每一行执行计算,然后将输出写入rails模型 我在连接数据库或通过ActiveRecord访问记录方面没有任何问题,但我尝试在数据库上迭代的所有操作都失败了,或者耗时太长。我尝试了以下方法: ExternalDB.all.each Ex

我有一个postgres数据库,大约有200000000行和6列。这些列有int、date和string,但没有主键,也没有唯一的值作为主键的基础

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

我在连接数据库或通过ActiveRecord访问记录方面没有任何问题,但我尝试在数据库上迭代的所有操作都失败了,或者耗时太长。我尝试了以下方法:

  • ExternalDB.all.each
  • ExternalDB.find_all.each
  • 使用将“id”列添加到ExternalDB
我认为答案是使用SQL进行迭代,但我甚至不知道如何开始。

从Postgres的角度来看:

为了拥有索引,不需要具有唯一的值。(可以肯定的是,有唯一的索引,这是使用主键强制执行的,但这不是必需的。)

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

但是,根据查询的确切性质,它不一定保证将使用该索引。这在一定程度上取决于查询规划器认为查询将返回多少行,这将决定它是尝试使用索引进行扫描,还是进行顺序扫描

因此,一旦您创建了索引,请尝试在psql或PgAdmin中选择您想要使用的
并对其运行
EXPLAIN
,以查看查询计划器是否计划使用该索引,然后运行它以查看其执行情况


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

您将需要使用游标,或者是协议级别的游标,或者是一级游标

轻松地;看

您可能还会发现这个问题提供了信息:


我还没有检查源代码/文档,看看Pg gem是否支持PostgreSQL的协议级游标进行批处理读取,但是如果已经有一个工具来实现这一点(如上链接),那么可能不值得探索。

使用您提供的游标gem-非常好,谢谢!我认为这可能是我们扩大这项进口任务的最佳方法。现在,这可能比我们需要的多一点,不过我们还是投票赞成这一伟大的解释。谢谢我只投了200米的赞成票!里面有什么样的数据?