我是调优 postgreSQL 的新手,但已阅读此标准指南:https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server 并使用 pgtune 获得了一些配置建议。我在 Windows 8 上运行 postgreSQL 9.3,正在做数据分析,我的桌面有 24GB 内存、i7 四核处理器和 7200rpm 硬盘,使用英特尔智能响应的 32GB SSD 缓存。
似乎 postgreSQL 没有充分利用计算机,我想知道在调优方面我可能还需要做些什么。
pgtune 对 postgresql.conf 进行了以下更改:
- default_statistics_target = 100
- maintenance_work_mem = 480MB
- constraint_exclusion = on
- checkpoint_completion_target = 0.9
- effective_cache_size = 2816MB
- work_mem = 96MB
- wal_buffers = 32MB
- checkpoint_segments = 64
- shared_buffers = 960MB
- 最大连接数 = 20
现在我运行这个复杂的自连接,在具有 1 亿行和四个整数列的 5GB 表“training”上按查询分组计数:
SELECT t1.m_id, t2.m_id, count(*)
FROM training t1, training t2
WHERE t1.u_id = t2.u_id AND t1.m_id < t2.m_id
GROUP BY t1.m_id, t2.m_id
EXPLAIN 揭示了以下查询计划:
GroupAggregate (cost=4984590388.65..5216672318.82 rows=25381444 width=8)
-> Sort (cost=4984590388.65..5042547417.59 rows=23182811573 width=8)
Sort Key: t1.m_id, t2.m_id
-> Nested Loop (cost=0.57..676446040.92 rows=23182811573 width=8)
-> Seq Scan on training t1 (cost=0.00..1621754.12 rows=99072112 width=8)
-> Index Only Scan using training_u_id_m_id_idx on training t2 (cos=0.57..4.90 rows=191 width=8)
Index Cond: ((u_id = t1.u_id) AND (m_id > t1.m_id))
它已经运行了 8 个小时,但让我感兴趣的是任务管理器显示的内容。 PostgreSQL 服务器进程仅使用:
- 15% 的中央处理器
- 6.1% 内存(约 512MB)
- 3.5% 磁盘
没有其他进程占用大量资源。令我惊讶的是,考虑到查询的复杂性,postgreSQL 不会使用更多的可用资源,有人知道会发生什么吗?我的 pgtune 值看起来不错吗?
我也做了一些研究,结果告诉我:
- 在 Windows 上,
shared_buffers
不应大于 512MB,应该使用系统缓存。问题:我是否必须以某种方式告诉 Windows 将系统缓存分配给 postgreSQL,或者如果 postgreSQL 请求它会自动发生吗? work_mem
允许数据库服务器在足够大的 RAM 中进行排序。问题:我的 work_mem 足够大吗?我如何判断排序是在 RAM 中还是在磁盘上完成?
如果有任何有助于加快查询速度的见解,我将不胜感激。谢谢!
最佳答案
我认为 effective_cache_size 听起来很小,试试 20GB。此外,对于分析工作负载,work_mem 非常小。如果你确定你不会有很多连接,我会将它设置为 1GB(并且进一步降低 max_connections 将保护你不会意外地运行很多连接)
单个 7200rpm 硬盘似乎不足以满足分析工作负载。我对“SSD cache using intel smart response”不太熟悉,也许这可以帮助弥补它。你能告诉我们有多少 5 GB 的表缓存在上面吗?
您可能还想增加 effective_io_concurrency,不知道 SSD 缓存如何执行我不知道这会有多大好处。但它可能会有所帮助,而且可能不会造成伤害。
低内存使用率是可以的。 Windows 应该使用内存来缓存文件数据,这应该对 postgres 有很大帮助,但不会向 postgres 收费。
我不知道在任务管理器中哪里可以找到“3.5% 磁盘”,我找不到这样的指标。
PostgreSQL 9.3 不会将单个查询并行化到多个 CPU(9.6 版中添加了并行查询),因此 15% 的 CPU 使用率离完全 CPU 绑定(bind)不远。
关于windows - 在 Windows 桌面上调整 postgreSQL 以利用 24GB RAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21660323/