在Windows桌面上调整postgreSQL以利用24GB RAM

时间:2014-02-09 14:31:50

标签: windows performance postgresql ram

我是调试postgreSQL的新手,但已阅读此标准指南:https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server 并使用pgtune获取一些配置建议。我在Windows 8上运行postgreSQL 9.3,正在进行数据分析,我的桌面有24GB RAM,一个i7 4核处理器,以及一个7200rpm hdd,带有32GB SSD缓存,使用intel智能响应。

似乎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
  • max_connections = 20

现在我运行这个复杂的自联接,在5GB表“training”上使用group by查询,该训练有1亿行和4个整数列:

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 Server进程仅使用:

  • 15%CPU
  • 6.1%内存(约512MB)
  • 3.5%磁盘

没有其他进程占用大量资源。令我惊讶的是,鉴于查询的复杂性,postgreSQL不会使用更多可用资源,是否有人知道可能会发生什么?我的pgtune值看起来好吗?

我做了一些研究,告诉我:

  1. 在Windows上shared_buffers不应大于512MB,而应使用该系统缓存。问题:我是否必须以某种方式告诉Windows将系统缓存分配给postgreSQL,或者如果postgreSQL请求它会自动发生吗?
  2. work_mem允许数据库服务器在RAM足够大的情况下对RAM进行排序。问题:我的work_mem足够大吗?如何判断是在RAM中还是在磁盘上完成排序?
  3. 我很感激任何有助于加快此查询的见解。谢谢!

1 个答案:

答案 0 :(得分:4)

我认为effective_cache_size听起来很小,试试20GB。此外,对于分析工作负载,work_mem非常小。如果你确定你没有很多连接(并且进一步降低max_connections将保护你不会意外地运行很多连接),我将它设置为1GB。

对于分析工作负载而言,单个7200rpm hdd似乎不够用。我不熟悉使用英特尔智能响应&#34;&#34; SSD缓存,也许这可以帮助弥补它。你能告诉我们5 GB表中有多少缓存在它上面吗?

您可能还需要增加effective_io_concurrency,不知道SSD缓存的执行情况我不知道会有多少好处。但它可能有所帮助,可能不会受到伤害。

内存使用率低是可以的。 Windows应该使用内存来缓存文件数据,这应该有助于postgres,但不会向postgres收费。

我不知道你在任务管理器中找到了什么&#34; 3.5%磁盘&#34;,我找不到这样的指标。

PostgreSQL 9.3没有将单个查询并行化到多个CPU(版本9.6中添加了并行查询),因此15%的CPU使用率并不是完全受CPU限制的。