ERROR: could not write block 37583345 of temporary file: No space left on device
ERROR: could not write block 37583345 of temporary file: No space left on device
我想要这样的输出:
obid | sid_count
1 | 3
2 | 2
3 | 4
obid 在 custdata table 上,sid_count 从标识符 table 中获取。
样本数据为:
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亿条记录。
如何克服这个问题?为什么数据库需要写入磁盘?或者我需要重写我的查询吗?因为我无法向磁盘添加更多 space。
谢谢。
问题是你不小心写了一个交叉连接:
from myschema.custdata, myschema.identifier
也就是说,一个 table 的 2.5 亿行中的每一行都与另一个 table 的 6500 万行中的每一行相连接,从而产生 16.25 千万亿个结果行。您的数据目录似乎没有空间来缓存完成查询所需的临时文件,因此您 运行 磁盘空间不足 space。
作为解决方案,添加一个连接条件。
抓住机会,学习再也不会像这样编写连接。始终使用标准语法:
FROM a JOIN b ON <condition>
这样你就不会忘记连接条件,除非你明确指定
FROM a CROSS JOIN b
哪个会更明显。
我想要这样的输出:
obid | sid_count
1 | 3
2 | 2
3 | 4
obid 在 custdata table 上,sid_count 从标识符 table 中获取。
样本数据为:
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亿条记录。
如何克服这个问题?为什么数据库需要写入磁盘?或者我需要重写我的查询吗?因为我无法向磁盘添加更多 space。
谢谢。
问题是你不小心写了一个交叉连接:
from myschema.custdata, myschema.identifier
也就是说,一个 table 的 2.5 亿行中的每一行都与另一个 table 的 6500 万行中的每一行相连接,从而产生 16.25 千万亿个结果行。您的数据目录似乎没有空间来缓存完成查询所需的临时文件,因此您 运行 磁盘空间不足 space。
作为解决方案,添加一个连接条件。
抓住机会,学习再也不会像这样编写连接。始终使用标准语法:
FROM a JOIN b ON <condition>
这样你就不会忘记连接条件,除非你明确指定
FROM a CROSS JOIN b
哪个会更明显。