PostgreSQL:需要在从文件复制或从标准输入复制之间进行选择

Posted

技术标签:

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

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

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

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

提前谢谢你,

客户体验

【问题讨论】:

这几百万条记录每次都一样吗?你的数据库不是持久化的吗? 相同的列,不同的数据。数据库是持久的,afaik。 你的表有索引吗?触发器?约束?您是否在事务中批量插入? 除了PK之外没有索引,没有触发器,大量的FK。没有批处理。 阅读:***.com/questions/758945/… 【参考方案1】:

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

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

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

【讨论】:

以上是关于PostgreSQL:需要在从文件复制或从标准输入复制之间进行选择的主要内容,如果未能解决你的问题,请参考以下文章

在 cmake 中,我怎样才能始终执行一个进程? (或从 add_custom_command 捕获标准输出)

从文件或标准输入读取

postgresql----COPY之表与文件之间的拷贝

Android:在捕获或从图库中挑选后裁剪图像

C 输入 & 输出

为啥我在从 Java 批量执行 PostgreSQL 存储过程时收到错误消息,提示“未预期结果”?