在查询 postgres 数据库的过程中磁盘空间不足

Has*_*aig 5 postgresql postgresql-9.3

数据库上的 SELECT 查询(带有表 JOIN)在运行时会影响磁盘空间吗?

背景:我有一个带有 Postgresql 后端的 Django 应用程序 (9.3.10)。我的数据库驻留在磁盘空间严重不足的虚拟机中(大约还剩 400MB)。

我查询了几个表以评估要弃用哪些数据以释放磁盘空间(这些包括跨表连接)。这些分析类型的查询被捆绑在一个单一的 url 后面,并统一运行。当我点击 url 时,包含我的数据库的虚拟机在大约半分钟后空间不足。

我是一个偶然的 DBA,仍在学习绳索。谁能解释为什么我在这种情况下空间不足?在此类操作中是否创建了某种临时文件?如果需要,我将分享我的配置详细信息。

Eva*_*oll 7

当然,实际上有很多方法SELECT可以占用磁盘空间。只需查看文档即可work_mem

work_mem (integer) 指定内部排序操作和哈希表在写入临时磁盘文件之前要使用的内存量。该值默认为四兆字节 (4MB)。请注意,对于复杂查询,可能会并行运行多个排序或散列操作;在开始将数据写入临时文件之前,将允许每个操作使用与此值指定的内存一样多的内存。此外,多个正在运行的会话可能会同时执行此类操作。因此,使用的总内存可能是 work_mem 值的许多倍;在选择值时有必要记住这一事实。排序操作用于 ORDER BY、DISTINCT 和合并连接。哈希表用于哈希连接、基于哈希的聚合和基于哈希的 IN 子查询处理。

即使使用高work_memaSELECT也可以占用磁盘空间。例如,您可以拥有一个直接写入磁盘的函数。

您可能有兴趣通过使用来减轻这种情况 temp_file_limit

temp_file_limit (integer) 指定进程可用于临时文件的最大磁盘空间量,例如排序和散列临时文件,或用于持有游标的存储文件。尝试超过此限制的交易将被取消。该值以千字节为单位指定,-1(默认值)表示没有限制。只有超级用户才能更改此设置。