无法在 Windows 服务器上使用 PostgreSQL 9.3 将 work_mem 增加到 1GB 以上

Cannot increase work_mem above 1GB using PostgreSQL 9.3 on Windows Server

我想调整 postgres 配置以在 Windows 服务器上使用。这是我当前的 posgresql.conf 文件:http://pastebin.com/KpSi2zSd

我想增加 work_memmaintenance_work_mem,但是如果我将值提高到 1GB 以上,我会在启动服务时收到此错误:

日志文件中没有添加任何内容(至少 data\pg_log 中没有)。我如何找出导致问题的原因(增加日志记录)? windows 和 postgres 之间的问题管理有什么关系吗?

这是我的服务器规格:

在 Windows 下,work_mem 的值限制为 2GB(即使在 64 位系统上)- 据我所知没有解决方法。

我不知道为什么你不能将它设置为 1GB。也许 work_memmaintenance_work_mem 的总和还有另一个我不知道的限制。

work_mem 默认设置 通常不是一个好主意。对于 512GB RAM 和只有 10 个用户,这 可能 有效,但请记住,work_mem 的数量是由一个语句为每个排序、分组或散列操作请求的询问。所以你可以有一个语句请求这个内存量 15 或 20 次。

您不需要在 postgresql.conf 中更改它 - 如果您知道以下查询将受益于 运行 的大型 work_mem,则可以动态更改它:

set session work_mem='2097151';

如果您使用更大的数字,您将收到一条错误消息,告诉您限制:

ERROR: 2097152 is outside the valid range for parameter "work_mem" (64 .. 2097151)


即使 Postgres 没有使用所有内存,它仍然可以从中受益。 Postgres(与 Oracle 不同)严重依赖文件系统缓存,而不是自己进行所有缓存。 shared_buffers 的值超过大约 8GB 很少显示出任何好处。

需要告诉Postgres操作系统通常使用多少内存用于缓存,通过将effective_cache_size设置为适当的值。 Postgres 不会 使用 缓存,但它会影响计划者的选择,例如如果索引可能在文件系统缓存中,则优先使用索引扫描而不是 seq 扫描。

您可以在 Windows 任务管理器(或例如 ProcessExplorer)中查看文件系统缓存的当前大小

如上所述,在windows中依赖OS缓存更为有利。 如果您使用 sysinternals (Microsoft) 的 RAMMAP,您可以准确地看到 postgres 在 OS 缓存中使用了什么,以及实际缓存了多少。