将大量数据加载到PostgreSQL中的最佳方法是什么?

时间:2015-05-12 07:28:45

标签: database postgresql copy loading

我想将大量数据加载到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不会加快导入本身,但会在导入后加快操作。

您是否有任何其他建议或者您不同意上述设置?

1 个答案:

答案 0 :(得分:1)

使用索引,但唯一的单个数字键除外。

这不符合我们收到的所有数据库理论,但是使用大量数据进行测试就证明了这一点。这是一次100M负载的结果,在一个表中达到20亿行,并且每次在结果表上进行各种查询。第一个图形有10千兆位NAS(150MB / s),第二个带有4个SSD在RAID 0(R / W @ 2GB / s)。

Index use vs sequential - 150MB/s disks

如果在常规磁盘上的表中有超过2亿行,那么如果忘记索引则会更快。在SSD上,限制为10亿。

Index use vs sequential - 2 GB/s SSD

我也使用分区来获得更好的结果但是如果使用存储过程,使用PG9.2很难从中受益。您还必须一次只处理1个分区的写入/读取。但是,分区是将表保持在10亿行墙下方的方法。它还可以帮助大量对您的负载进行多处理。使用SSD,单个进程允许我插入(复制)18,000行/秒(包括一些处理工作)。在6 CPU上进行多处理时,它会增长到80,000行/秒。

注意你的CPU和测试时使用IO以优化两者。