2016-08-29 1194 views
0

我有一个大约800GB的庞大数据库。当我试图运行一个将某些变量分组并且汇总结果的查询时,它在运行几个小时后停止。 Postgres发出消息说磁盘空间已满。在查看统计数据后,我意识到dB具有大约400GB的临时文件。我相信这些临时文件是在我运行查询时创建的。我的问题是如何删除这些临时文件。另外,我该如何避免这些问题 - 使用游标或for循环不能一次处理所有数据?谢谢。删除postgresql中的临时文件

我使用的是Postgres 9.2

+1

你是如何“看统计”,什么“临时文件”被你说了吗?临时表在会话结束时被删除,因此关闭会话然后打开一个新会话应该可以解决问题。 – Patrick

+0

上面的内容应该可以转移到答案上。 – d1ll1nger

+0

最可能的原因是(无意识的)Carthesian产品。 – joop

回答

1

当查询完成后不会被删除,它们会在base/pgsql_tmp查询执行过程中创建的临时文件。您不应该手动删除它们。
这些文件与临时表无关,它们用于存储不适合work_mem的大型散列或排序操作的数据。

确保查询已完成或取消,请尝试连续运行CHECKPOINT两次,查看文件是否仍然存在。如果是的话,那是一个错误; PostgreSQL服务器在磁盘空间不足时崩溃了吗?

如果你真的有base/pgsql_tmp旧文件不会自动删除,我认为它是安全的手动删除它们。但在这种情况下,我会用PostgreSQL提交一个bug。

如果执行计划需要对大型结果集进行排序或需要创建大型哈希值,则无法避免大型临时文件。游标不会帮助你。我想用for-loops表示将处理从数据库移动到应用程序代码–,这通常是一个错误,并且只会将问题从数据库移动到另一个处理效率较低的地方。

更改您的查询,以便它不必排序或散列较大的结果集(请检查EXPLAIN)。我知道这听起来不是很有帮助,但没有更好的办法。无论如何,你可能必须这么做,或者几个小时的运行时间可以接受吗?

+0

谢谢。我正在使用一些自定义聚合函数,我相信这是创建大型临时文件。 EXPLAIN显示聚集函数正在排序数据。我想知道是否有办法避免在聚合函数中进行排序。我对结果的顺序不感兴趣。几个小时的运行时间是可以接受的,因为这是对数据的一次性处理,但是大的临时文件正在停止查询执行。谢谢。 –

+0

带*自定义聚合函数*是指第三方C函数?不知道如何定义聚合函数以及'EXPLAIN'输出是什么样子,很难回答这个问题。 –

-1

试试这个

SELECT temp_files AS "Temporary files" 
    , temp_bytes AS "Size of temporary files" 
FROM databse_name db;