我正在运行一个非常大的查询,在表中插入了很多行,在一些较小的查询中划分了近800万行,但在某些时刻出现了错误:“我收到错误”无法写入块....临时文件没有空间留在设备上......“使用postgresql”。我不知道是否需要在每次查询后删除临时文件以及如何执行此操作,或者是否与其他问题相关。
谢谢
答案 0 :(得分:6)
行。由于仍有一些事实缺失,尝试回答可能会澄清问题:
您的磁盘空间不足。很可能是因为您的磁盘上没有足够的空间。例如,检查Linux / Unix df -h
。
告诉你,这是怎么发生的: 拥有一个可能有3个整数的表,数据本身就会占用大约12个字节。您需要为行管理等添加一些开销。在another answer上,Erwin提到了23Byte并链接到手册以获取更多信息。也可能需要在行之间进行一些填充等。所以做一些数学运算:
即使使用3整数,我们也会以每行约40个字节结束。考虑到你想插入8,000,000,这将总计320,000,000Byte或~300MB(仅我们的3个整数示例,非常粗略)。
现在给出,你在这个表上有几个索引,索引也会在插入过程中增长。另外一个方面可能是桌面上的膨胀和可能可以用真空清除的索引。
那么解决方案是什么:
答案 1 :(得分:2)
插入数据或索引(创建)始终需要temp_tablespaces,它确定临时表和索引以及用于诸如对大型数据集进行排序之类的目的的临时文件的位置。根据您的错误,这意味着您的temp_tablespace位置不足以容纳磁盘空间。
要解决此问题,您可能需要以下两种方法:
1.将temp_tablespace的空间重新声明为默认的/ PG_DATA / base / pgsql_tmp
2.如果您的temp_tablespace空间仍然不足以进行临时存储,则可以为该数据库创建另一个临时表空间:
create tablespace tmp_YOURS location '[your enough space location';
alter database yourDB set temp_tablespaces = tmp_YOURS ;
GRANT ALL ON TABLESPACE tmp_YOURS to USER_OF_DB;
然后断开会话并重新连接。
答案 2 :(得分:1)
错误很明显。您正在运行一个大查询,但没有足够的磁盘空间来执行此操作。如果有足够的空间来运行查询,则在/opt ... .check中安装postgresql。如果不是LIMIT输出以确认您获得了预期的输出,然后继续运行查询并将输出写入文件。