错误:无法写入临时文件的块 37583345:设备上没有剩余空间

Posted

技术标签:

【中文标题】错误:无法写入临时文件的块 37583345:设备上没有剩余空间【英文标题】:ERROR: could not write block 37583345 of temporary file: No space left on device 【发布时间】:2019-12-11 02:44:51 【问题描述】:

我想要这样的输出:

obid     | sid_count
1        |  3
2        |  2
3        |  4

obid 在 custdata 表上,sid_count 来自标识符表。

样本数据为:

custdata
obid
1
2
3

identifier
obid | type
1    | SID
1    | SID
1    | XID
1    | SID
2    | SID
2    | SID
3    | SID
3    | SID
3    | XID
3    | SID
3    | SID

我尝试运行这个查询:

select custdata.obid,
count (identifier.obid) filter (where identifier.type = 'SID') as sid_count
from myschema.custdata, myschema.identifier group by custdata.obid

花了大约一个小时,但出现错误:

[53100] ERROR: could not write block 37583345 of temporary file: No space left on device

custdata 大约有 6500 万条记录。 标识符大约有 2.5 亿条记录。

如何克服这个问题?为什么数据库需要写入磁盘?还是我需要重写我的查询?因为我无法向磁盘添加更多空间。

谢谢。

【问题讨论】:

【参考方案1】:

问题是你不小心写了一个交叉连接:

from myschema.custdata, myschema.identifier

也就是说,一个表的 2.5 亿行中的每一行都与另一个表的 6500 万行中的每一行连接起来,从而产生 16.25 万亿个结果行。您的数据目录似乎没有空间来缓存完成查询所需的临时文件,因此您那里的磁盘空间不足。

作为解决方案,添加连接条件。

抓住机会,学习再也不会这样写联接。始终使用标准语法:

FROM a JOIN b ON <condition>

这样你就不会忘记连接条件,除非你明确指定

FROM a CROSS JOIN b

这将更加明显。

【讨论】:

以上是关于错误:无法写入临时文件的块 37583345:设备上没有剩余空间的主要内容,如果未能解决你的问题,请参考以下文章

了解致命错误:无法在写入上下文中使用临时表达式

-bash: 无法为立即文档创建临时文件: 设备上没有空间

MySQL 无法写入临时目录

电脑安装软件时显示无法写入文件是啥意思?

使用 Yii 无法写入 mPDF 临时文件

放入光盘 windows不能从此盘读取,总是显示"准备好写入光盘的文件"