postgresql快速插入数据整理

因为论坛上回答了一个帖子,也记录在这里。

帖子:postgresql 如何支持10亿级别的数据??

写入数据库的性能有好多影响因素,大概帮着总结几句。如果有钱,愿意投入10-20万,那直接转到最后(0)。

1、如果是备份整体一波导入(如pgRestore),那就是COPY最快,而非INSERT。导入完了,再建立索引和各种约束。

2、那种表单可以整体删除、改名的,参考1. 先建立临时表,导入完毕后,老的改_OLD,新的改为正确的名字。

3、大部分情况是无法如此理想的,面对的都是热导入(结构、约束、参照完整性、名称都不能修改)。一般遵循4-6.

4、导入前调整参数postgresql.conf
(1)导入前关闭auto_vacuum选项。
(2)调节wal的性能,checkpoint 放宽,往大了整,共享、maintain内存设大。如果是32G的服务器,共享设为1G,maintain 1G即可。
(3)如果你的导入中,有很多触发警告的操作,把各种日志的级别设为fatal以上。这样防止产生大量文本日志。

5、导入时,一般都是一个工具完成的。比如C++Qt、python,等等。工具开发的好不好,就很关键。以Qt为例子
(4)对于需要查询后按需导入的情况,要在数据库连接打开后,尽快设置为“前向”forwordOnly,首先降低查询的代价。
(5)把任务囤积起来,用事务切割为10万条一个单位,而后调用QSqlQuery::execBatch功能整体的执行插入。插入后commit。

6、如果做了上述工作,还是很慢,那就请进行有针对性的分析式优化:
(6)观察网络使用率。若网络使用率>=90%, 请在数据库本地导入,而不是基于以太网。以太网会带来很多开销。
(7)观察服务器当前导入的进程(postgres)的CPU,如果CPU达不到单核全满,则说明磁盘爆了。请使用固态或者万转盘阵. 这种情况常出现在访问量密集,单记录简单的情况。
(8)观察服务器当前导入的进程(postgres)的CPU,如果CPU单核全满,而磁盘不满,说明计算力不够。此时,插入时开N个会话一起干,直到CPU与磁盘达到均衡(一般是CPU单核会话50%,磁盘也略有拥塞)。这种情况比较少,比如你的记录有很多数组、JSON\GIS之类的复杂类型, 且触发器里做计算时常见。

做到这里基本就差不多了……话锋一转:

0、最终,钱能够显著提高插入的速率。记住:有钱就可以韧性,买8~10块SSD做成盘阵,CPU上5-6万一块的至强,而后多会话并行插入,1-8都不用看了。

你可能感兴趣的:(PostgreSQL,开源,postgresql)