我有一个大约800GB的庞大数据库。当我尝试运行一个对某些变量进行分组并聚合结果的查询时,它会在运行几个小时后停止。 Postgres抛出了磁盘空间已满的消息。在查看统计数据后,我意识到dB有大约400GB的临时文件。我相信这些临时文件是在我运行查询时创建的。我的问题是如何删除这些临时文件。另外,如何避免此类问题 - 使用游标或for循环不能一次处理所有数据?感谢。
我正在使用Postgres 9.2
答案 0 :(得分:4)
查询执行期间在base/pgsql_tmp
中创建的临时文件将在查询完成后被删除。你不应该手工删除它们
这些文件与临时表无关,它们用于存储不适合work_mem
的大型散列或排序操作的数据。
确保查询已完成或取消,请尝试连续两次运行CHECKPOINT
并查看文件是否仍然存在。如果是,那就是一个错误; PostgreSQL服务器在磁盘空间不足时崩溃了吗?
如果你真的有base/pgsql_tmp
中的旧文件没有被自动删除,我认为手动删除它们是安全的。但在这种情况下,我会向PostgreSQL提交一个错误。
如果执行计划需要对大型结果集进行排序或需要创建大型哈希值,则无法避免大型临时文件。游标不会帮助你。我想用 for-loops 表示将处理从数据库转移到应用程序代码 - 这样做通常是一个错误,只会将问题从数据库移到另一个处理效率较低的地方。 / p>
更改您的查询,以便它不必排序或散列大型结果集(请与EXPLAIN
一起检查)。我知道这听起来不是很有帮助,但没有更好的办法。你可能还是要这样做,或者你可以接受几个小时的运行时间?
答案 1 :(得分:-2)
尝试这个
SELECT temp_files AS "Temporary files"
, temp_bytes AS "Size of temporary files"
FROM databse_name db;