为大量 INSERTS 和 bytea 更新优化 PostgreSQL

And*_*niy 12 performance insert database-tuning postgresql-9.3 bytea performance-tuning

我们有什么(软件):

  • 带有基本配置的PostrgeSQL 9.3(在 中没有变化postgresql.conf
  • 视窗 7 64 位

硬件:

  • 英特尔酷睿 i7-3770 3.9 GHz
  • 32 Gb 内存
  • WDC WD10EZRX-00L4HBATa 驱动器(1000Gb,SATA III)

所以,我们必须加载到数据库 aprox。100.000.000行与bytea列,以及更简单的500.000.000行(无 LOB)。varchar第一个表上有 2 个索引(长度为 13、19),varchar第二个表上有 2个索引(长度为 18、10)。每个表也有生成 id 的序列。

到目前为止,这些操作使用 8 个并行连接和 50 个 JDBC 批处理大小进行。下图展示了系统负载:它对postgresql进程是零负载。加载 24 小时后,我们只加载了 10.000.000 行,这是非常缓慢的结果。

在此处输入图片说明

我们寻求帮助调整PostrgreSQL配置的目的是:

1)为了超快加载这个数量的数据,它是一次性操作,所以它可以是临时配置

2) 对于生产模式,通过它们的索引对这 2 个表执行中等数量的 SELECT,无需连接和排序。

Cra*_*ger 14

对于insert性能,见加快插在PostgreSQL的性能批量插入PostgreSQL中

您正在浪费时间使用 JDBC 批处理insert. PgJDBC 对insert批处理没有任何用处,它只是运行每个语句<-- 这在较新的 PgJDBC 版本中不再适用,它现在可以批处理准备好的语句以大大减少往返时间。但最好还是:

使用COPY代替; 请参阅PgJDBC 批处理复制CopyManager. 至于并发加载器的数量:如果操作受磁盘 I/O 限制,则每个磁盘的目标是几个。八可能是你最想要的。

对于您的“生产模式”,我建议加载数据样本,设置您希望运行的查询,并explain analyze用于调查性能。仅出于测试目的,使用enable_参数来探索不同的计划选择。为您的系统适当设置查询计划器成本参数(random_page_costseq_page_costeffective_cache_size等),并确保shared_buffers设置适当。在添加模拟生产工作负载时,使用auto_explain模块、log_min_duration_statement设置、pg_stat_statements扩展等继续进行监控。

有关详细信息,请参阅 PostgreSQL 用户手册。当您对explain analyze查询执行细节等有更具体的问题时,我建议回到这里。