删除postgresql中的临时文件

delete temporary files in postgresql

我有一个大约 800GB 的巨大数据库。当我尝试 运行 对某些变量进行分组并汇总结果的查询时,它在 运行 宁了几个小时后停止。 Postgres 正在抛出一条消息,指出磁盘 space 已满。查看统计数据后,我意识到 dB 有大约 400GB 的临时文件。我相信这些临时文件是在我 运行 进行查询时创建的。我的问题是如何删除这些临时文件。另外,如何避免此类问题——使用游标或 for 循环来不一次处理所有数据?谢谢。

我正在使用 Postgres 9.2

查询执行期间在 base/pgsql_tmp 中创建的临时文件将在查询完成后删除。你不应该手动删除它们。
这些文件与临时表无关,它们用于存储不适合 work_mem.

的大型散列或排序操作的数据。

确保查询完成或取消,连续尝试运行 CHECKPOINT两次,看看文件是否还在。如果是,那是一个错误; 运行 磁盘 space 不足时,PostgreSQL 服务器是否崩溃?

如果 base/pgsql_tmp 中确实有旧文件不会被自动删除,我认为手动删除它们是安全的。但在这种情况下,我会向 PostgreSQL 提交错误。

如果您的执行计划需要对大型结果集进行排序或需要创建大型散列,则无法避免大型临时文件。游标不会在那里帮助你。我猜 for-loops 你的意思是将处理从数据库转移到应用程序代码——这样做通常是一个错误,只会将问题从数据库转移到处理较少的另一个地方高效。

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