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 | psql
或 PQputCopyData
之外,您无能为力。
-
禁用对数据库的所有其他访问,终止所有客户端连接。
在没有批量数据的情况下备份数据库,因为此过程很危险(在此过程中崩溃、重新启动或电源故障将使您的数据库损坏无法修复)。
关闭数据库。
将
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:需要在从文件复制或从标准输入复制之间进行选择的主要内容,如果未能解决你的问题,请参考以下文章