Postgres中的work_mem选项如何工作?以下是http://www.postgresql.org/docs/8.4/static/runtime-config-resource.html的说明:
Specifies the amount of memory to be used by internal sort operations and hash tables before switching to temporary disk files. The value defaults to one megabyte (1MB). Note that for a complex query, several sort or hash operations might be running in parallel; each one will be allowed to use as much memory as this value specifies before it starts to put data into temporary files. Also, several running sessions could be doing such operations concurrently. So the total memory used could be many times the value of work_mem; it is necessary to keep this fact in mind when choosing the value. Sort operations are used for ORDER BY, DISTINCT, and merge joins. Hash tables are used in hash joins, hash-based aggregation, and hash-based processing of IN subqueries.
我可能完全错了,但是......不是“切换到临时磁盘文件”与操作系统中的“虚拟内存”基本相同吗?一旦RAM消失,操作系统不会只创建一个交换文件吗?将它设置为类似于100TB并让操作系统弄清楚它会不会更好?在我可能弄乱我的系统之前,我想检查是否有人真正尝试过这种方法。
答案 0 :(得分:7)
此外,如果发现数据不适合RAM,PostgreSQL可以切换到完全不同的计划(例如,使用不同的JOIN方法)。
设置work_mem太高只要有足够的数据就会让你获得一个非常慢的数据库,这样一切都不再适合RAM了。
答案 1 :(得分:5)
请注意,work_mem
是每个单个排序操作可用于的最大RAM量。对于单个查询,多个排序操作可能并行运行,并且可能有多个连接一次查询数据库。因此,所有排序操作都可以使用RAM中work_mem的x倍(这就是推荐保守金额的原因)。
现在回到你的问题,如果你选择一个work_mem
这么高的值,排序操作可能会耗尽你的大部分RAM,这会导致从交换页面输入和输出(请记住,有许多其他进程和PostgreSQL部分需要一些(甚至很多)RAM。基于磁盘的排序操作比操作系统完成的页面交换更有效。正如其他一些回复指出的那样,数据库服务器有一个换掉并且不断地表现得非常慢。
另一点是,如果具有如此高的work_mem
值,单个查询(故意或偶然)可能会或多或少地使整个数据库服务器无响应。
答案 2 :(得分:4)
交换的数据库服务器是一个死数据库服务器。
在RAM postgres使用quicksort,在磁盘上它使用另一种更适合硬盘的算法。在换出的内存上使用快速排序将非常慢。
答案 3 :(得分:0)
OS处理交换的术语是通用的,此外,进程可以使用的地址空间有限,在32位系统上并不是那么大(Windows 32位平台上的2Gb,可以增强)到3Gb),但你是对的,你可以让操作系统通过虚拟内存来处理这个问题。
PostgreSQL不是“通用的”它比一般操作系统知道如何在涉及磁盘访问后如何构建数据,因此一旦内存耗尽,让数据库切换到显式文件处理将比使操作系统处理更有利它