【问题标题】:Postgres Bulk Data Import and Populate Associated DataPostgres 批量数据导入和填充相关数据
【发布时间】:2013-06-07 13:15:40
【问题描述】:

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

什么是执行此操作的有效方法?更新时可以通过JOIN 查询来完成吗?

【问题讨论】:

  • 请显示表定义和查询。不然猜测太多了。您还应该始终在问题中提及您的版本(PostgreSQL、Ruby 等)。展示你已经在做什么。 (编辑后在此处回复,我会查看)。

标签: ruby-on-rails database postgresql query-optimization


【解决方案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。当您创建多个导入表时,它可以高度并行运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    相关资源
    最近更新 更多