我想将大量数据加载到PostgreSQL中。你知道其他任何"技巧"除了PostgreSQL的文档中提到的那些?
到目前为止我做了什么?
1)在postgresql.conf中设置以下参数(对于64 GB的RAM):
shared_buffers = 26GB
work_mem=40GB
maintenance_work_mem = 10GB # min 1MB default: 16 MB
effective_cache_size = 48GB
max_wal_senders = 0 # max number of walsender processes
wal_level = minimal # minimal, archive, or hot_standby
synchronous_commit = off # apply when your system only load data (if there are other updates from clients it can result in data loss!)
archive_mode = off # allows archiving to be done
autovacuum = off # Enable autovacuum subprocess? 'on'
checkpoint_segments = 256 # in logfile segments, min 1, 16MB each; default = 3; 256 = write every 4 GB
checkpoint_timeout = 30min # range 30s-1h, default = 5min
checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0
checkpoint_warning = 0 # 0 disables, default = 30s
2)事务(禁用自动提交)+设置隔离级别(尽可能低:可重复读取)我创建一个新表并在同一事务中将数据加载到其中。
3)设置COPY
命令以运行单个事务(据称这是COPY
数据的最快方法)
5)禁用autovacuum(添加新的50行后不会重新生成统计信息)
6)FREEZE COPY FREEZE
不会加快导入本身,但会在导入后加快操作。
您是否有任何其他建议或者您不同意上述设置?
答案 0 :(得分:1)
不使用索引,但唯一的单个数字键除外。
这不符合我们收到的所有数据库理论,但是使用大量数据进行测试就证明了这一点。这是一次100M负载的结果,在一个表中达到20亿行,并且每次在结果表上进行各种查询。第一个图形有10千兆位NAS(150MB / s),第二个带有4个SSD在RAID 0(R / W @ 2GB / s)。
如果在常规磁盘上的表中有超过2亿行,那么如果忘记索引则会更快。在SSD上,限制为10亿。
我也使用分区来获得更好的结果但是如果使用存储过程,使用PG9.2很难从中受益。您还必须一次只处理1个分区的写入/读取。但是,分区是将表保持在10亿行墙下方的方法。它还可以帮助大量对您的负载进行多处理。使用SSD,单个进程允许我插入(复制)18,000行/秒(包括一些处理工作)。在6 CPU上进行多处理时,它会增长到80,000行/秒。
注意你的CPU和测试时使用IO以优化两者。