我有一个 Postgres 数据库,每天从各种外部来源更新几次,每条记录都有像 company_id 和 user_id 这样的字段,需要从现有表中查找并与记录一起保存。目前,我正在使用 Ruby 循环遍历新记录并通过 ActiveRecord 查询获取公司和用户 ID。但是,这是非常低效的。
什么是有效的方法来做到这一点?可以通过JOIN
更新查询来完成吗?
我有一个 Postgres 数据库,每天从各种外部来源更新几次,每条记录都有像 company_id 和 user_id 这样的字段,需要从现有表中查找并与记录一起保存。目前,我正在使用 Ruby 循环遍历新记录并通过 ActiveRecord 查询获取公司和用户 ID。但是,这是非常低效的。
什么是有效的方法来做到这一点?可以通过JOIN
更新查询来完成吗?
这取决于您如何加载数据,如果您使用“复制”加载它而不是在导入过程中查找它。我这里也有同样的情况,我就是这样做的:
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。当您创建多个导入表时,它可以高度并行运行。