我有一个 PostgreSQL 9.2 实例,它在 RHEL 6.3、8 核机器上运行,内存为 16GB。服务器专用于此数据库。鉴于默认的 postgresql.conf 在内存设置方面相当保守,我认为允许 Postgres 使用更多内存可能是个好主意。令我惊讶的是,遵循wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server 上的建议实际上显着降低了我运行的每个查询的速度,但在更复杂的查询中显然更明显。
我还尝试运行 pgtune,它给出了以下建议并调整了更多参数,但这并没有改变任何东西。它建议 1/4 RAM 大小的 shared_buffers 这似乎符合其他地方的建议(特别是在 PG wiki 上)。
default_statistics_target = 50
maintenance_work_mem = 960MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 11GB
work_mem = 96MB
wal_buffers = 8MB
checkpoint_segments = 16
shared_buffers = 3840MB
max_connections = 80
Run Code Online (Sandbox Code Playgroud)
我尝试在更改设置后重新索引整个数据库(使用reindex database),但这也无济于事。我玩过 shared_buffers 和 work_mem。从非常保守的默认值 (128k / 1MB) 逐渐改变它们会逐渐降低性能。
我运行EXPLAIN (ANALYZE,BUFFERS)了一些查询,罪魁祸首似乎是 Hash Join 明显变慢了。我不清楚为什么。
举一些具体的例子,我有以下查询。它在默认配置下运行约 2100 毫秒,在增加缓冲区大小的配置上运行约 3300 毫秒: …
有没有一种系统的方法可以强制 PostgreSQL 将特定表加载到内存中,或者至少从磁盘中读取它以便系统缓存它?