我有一个Postgres数据库,每天多次从各种外部源更新,每个记录都有像company_id和user_id这样的字段,需要从现有表中查找并与记录一起保存。目前,我正在使用Ruby循环遍历新记录,并使用ActiveRecord查询获取公司和用户ID。但这非常低效。
这样做的有效方法是什么?是否可以使用JOIN
更新查询来完成?
答案 0 :(得分: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。在创建多个导入表时,它可以高度并行运行。