0

我有一个 Postgres 数据库,每天从各种外部来源更新几次,每条记录都有像 company_id 和 user_id 这样的字段,需要从现有表中查找并与记录一起保存。目前,我正在使用 Ruby 循环遍历新记录并通过 ActiveRecord 查询获取公司和用户 ID。但是,这是非常低效的。

什么是有效的方法来做到这一点?可以通过JOIN更新查询来完成吗?

4

1 回答 1

1

这取决于您如何加载数据,如果您使用“复制”加载它而不是在导入过程中查找它。我这里也有同样的情况,我就是这样做的:

1) 将数据导入 IMPORT 表

\copy importtable (companyname, what, ever, i , need) from 'FILE' WITH DELIMITER AS ';' CSV HEADER;

2) 如果您导入还没有现有 ID 的新公司/用户,则此步骤是必需的。它查询没有 ID 的公司并创建新的 ID

INSERT INTO company (companyid,companyname)
SELECT  companyname
FROM importtable
        LEFT OUTER JOIN company ON (importtable.companyname=company.companyname)
WHERE company.companyid is NULL
GROUP BY companyname;

3) 将整个导入表插入合并表

INSERT INTO consolidationable(companyid, what,ever,you,need )
SELECT companyid, what,ever,you,need
  FROM importtable
        INNER JOIN company ON (importtable.companyname=company.companyname);

好消息是,它使用 COPY,因此导入本身很快,然后它使用所有缓冲区,因为 postgreSQL 可以一次查询所有公司 ID。当您创建多个导入表时,它可以高度并行运行。

于 2013-06-08T12:58:55.943 回答