let*_*ght 5 memory postgresql temp-tables
我有一个大约800GB的庞大数据库。当我尝试运行对某些变量进行分组并汇总结果的查询时,它在运行了几个小时后便停止了。Postgres发出一条消息,指出磁盘空间已满。查看统计数据后,我意识到dB大约有400GB的临时文件。我相信这些临时文件是在运行查询时创建的。我的问题是如何删除这些临时文件。另外,如何避免此类问题-使用游标或for循环不立即处理所有数据?谢谢。
我正在使用Postgres 9.2
完成base/pgsql_tmp查询后,在查询执行期间创建的临时文件将被删除。您不应该手工删除它们。
这些文件与临时表无关,它们用于存储不适合的大型散列或排序操作的数据work_mem。
确保查询已完成或已取消,请尝试连续运行CHECKPOINT两次,看看文件是否仍然存在。如果是,那是一个错误;磁盘空间不足时,PostgreSQL服务器崩溃了吗?
如果确实有旧文件base/pgsql_tmp不会自动删除,那么我认为手动删除它们是安全的。但是在那种情况下,我会向PostgreSQL提交错误。
如果执行计划需要对大型结果集进行排序或需要创建大型哈希,则无法避免使用大型临时文件。游标不会在这里帮助您。我猜对于for循环,您的意思是将处理从数据库移至应用程序代码–这样做通常是一个错误,只会将问题从数据库移至处理效率较低的其他地方。
更改查询,使其不必对大型结果集进行排序或散列(使用进行检查EXPLAIN)。我知道这听起来不是很有帮助,但是没有更好的方法。无论如何,您可能都必须这样做,还是可以接受几个小时的运行时间?