我们拥有的(软件):
- PostrgeSQL 9.3与基本配置(没有变化
postgresql.conf
) - 视窗 7 64 位
硬件:
- 英特尔酷睿 i7-3770 3.9 Ghz
- 32 Gb 内存
- WDC WD10EZRX-00L4HBAta 硬盘 (1000Gb, SATA III)
所以,我们必须加载到 DB aprox 中。带有bytea列的100.000.000行,以及更简单的500.000.000行(没有 LOB)。第一个表上有 2 个索引(长度为 13、19) ,第二个表上有 2 个索引(长度为 18、10)。每个表还有用于 id 生成的序列。varchar
varchar
到目前为止,这些操作使用 8 个并行连接和 50 个 JDBC 批处理大小进行。postgresql
下图展示了系统负载:它是进程的零负载。加载 24 小时后,我们只加载了 10.000.000 行,结果非常慢。
PostrgreSQL
我们在调整配置方面寻求帮助,目的是:
1)超快速加载这么多数据,是一次操作,所以可以临时配置
2) 对于生产模式,通过它们的索引对这两个表进行中等数量的 SELECT,而不进行连接和排序。
有关
insert
性能,请参阅加速 PostgreSQL 中的插入性能和 PostgreSQL 中的批量插入。您在为<-- 这在新的 PgJDBC 版本中不再适用,它现在可以批处理准备好的语句以显着减少往返时间。但最好还是:insert
. PgJDBC 对批处理没有任何用处insert
,它只是运行每个语句。改为使用
COPY
;请参阅PgJDBC 批量复制和CopyManager
. 至于并发加载器的数量:如果操作受磁盘 I/O 限制,则目标是每个磁盘一对。八可能是你最想要的。对于您的“生产模式”,我建议加载一个数据样本,设置您希望运行的查询,并使用
explain analyze
它来调查性能。仅出于测试目的,使用enable_
参数来探索不同的计划选择。为您的系统适当地设置查询计划器成本参数(random_page_cost
、seq_page_cost
、effective_cache_size
等),并确保shared_buffers
设置得当。在添加模拟生产工作负载时继续监控,使用auto_explain
模块、log_min_duration_statement
设置、pg_stat_statements
扩展等。有关详细信息,请参阅 PostgreSQL 用户手册。
explain analyze
当您在查询执行细节等方面遇到更具体的问题时,我建议您回到这里。