【问题标题】:PostgreSQL: Need to chose between COPY'ing from a file or from stdinPostgreSQL:需要在从文件复制或从标准输入复制之间进行选择
【发布时间】:2012-09-03 18:30:23
【问题描述】:

我正在插入数百万条来自 C++ 结构的记录。使用常规插入,我的性能很糟糕,即使在配置优化之后,数据库也占用了 98% 的程序时间。我正在阅读我应该使用 COPY 从 CSV 文件中导入它。

现在我不太确定先写入 CSV 文件然后将其重写到数据库是否会有很大的改进,因为写入会加倍。我看过管道 STDIN,但乍一看似乎还有很多开销,而且它是有限的

如果我有一个 CSV 格式的字符串,那么将该数据写入我的数据库的最快方法是什么?

提前谢谢你,

客户体验

【问题讨论】:

  • 这几百万条记录每次都一样吗?你的数据库不是持久化的吗?
  • 相同的列,不同的数据。数据库是持久的,afaik。
  • 你的表有索引吗?触发器?约束?您是否在事务中批量插入?
  • 除了PK之外没有索引,没有触发器,大量的FK。没有批处理。

标签: database postgresql csv query-optimization


【解决方案1】:

我假设您需要在离线数据库上执行一次。如果您需要在在线数据库上执行此操作,除了使用程序中的 your-program-generating-a-copy-command | psqlPQputCopyData 之外,您无能为力。

  1. 禁用对数据库的所有其他访问,终止所有客户端连接。
  2. 在没有批量数据的情况下备份数据库,因为此过程很危险(在此过程中崩溃、重新启动或电源故障将使您的数据库损坏无法修复)。
  3. 关闭数据库。
  4. pg_xlog 目录从数据目录移动到tmpfs(RAM 磁盘),对其进行符号链接。
  5. 运行postgres -F -c full_page_writes=off -c checkpoint_segments=128 …。它将比平时多需要大约 2GB 的可用 RAM - 做好准备。
  6. 从表中删除主键约束。
  7. 从表中删除外键约束。
  8. 使用 COPY 从标准输入和管道或 PQputCopyData 加载数据。
  9. 运行analyze
  10. 重新创建主键约束。
  11. 重新创建外键约束(由pg_dump 生成的文件在删除它们之前将在末尾有合适的命令)。
  12. 关闭数据库。
  13. 删除pg_xlog 符号链接并将pg_xlog 目录移回数据目录。
  14. 在服务器上运行sync 命令。
  15. 正常启动数据库。

这是基于文档中的Populating a Database 指南。

【讨论】:

    猜你喜欢
    • 2016-07-08
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2017-03-04
    • 2020-03-31
    • 2013-07-30
    相关资源
    最近更新 更多