我是否需要手动在PostgreSQL中使用VACUUM临时表?

时间:2018-01-19 13:32:42

标签: postgresql temp-tables

考虑我有一个应用服务器:

  • 使用连接池(具有相对较多的允许空闲连接),
  • 可以运行数月,
  • 大量使用临时表(DROP上没有COMMIT')。

以上意味着我可能 N “永久”数据库会话“持有” N 临时表,只有在重新启动服务器时才会删除它。

我很清楚autovacuum守护程序无法访问这些临时表。

我的问题是,如果我从临时表中经常INSERTDELETE,并且这些表应该“存活”很长时间,那么我是否需要删除后手动VACUUM这些表,或单个手册ANALYZE就足够了吗?

目前,如果我执行

select
  n_tup_del,
  n_live_tup,
  n_dead_tup,
  n_mod_since_analyze,
  vacuum_count,
  analyze_count
from
  pg_stat_user_tables
where
  relname = '...'
order by
  n_dead_tup desc;

我看到vacuum_count始终为零:

n_tup_del   n_live_tup  n_dead_tup  n_mod_since_analyze vacuum_count    analyze_count
64      3       64      0           0       16
50      1       50      26          0       3
28      1       28      2           0       5
7       1       7       4           0       4
3       1       3       2           0       4
1       6       1       8           0       2
0       0       0       0           0       0

这可能意味着确实需要手动VACUUM

2 个答案:

答案 0 :(得分:2)

https://www.postgresql.org/docs/current/static/sql-commands.html

  

ANALYZE - 收集有关数据库的统计信息

     

VACUUM - 垃圾收集   并可选择分析数据库

真空可以选择也分析。所以,如果你想要的只是 - 新的统计数据 - 只需analyze。如果要“恢复”未使用的行,请vacuum。如果你想要两者,请使用vacuum analyze

答案 1 :(得分:1)

使用了许多长寿的相当重的更新的临时表,并且运行了24小时以上的应用程序,并且使用了ANALYZE。但是VACUUM存在问题 - 如果您尝试在函数中使用,则会出现错误:

ERROR:  VACUUM cannot be executed from a function or multi-command string
CONTEXT:  SQL statement "vacuum xxxxxx"
PL/pgSQL function inline_code_block line 4 at SQL statement
SQL state: 25001

但后来我们发现,临时表实际上至少对我们的应用来说并不是那么有利。从技术上讲,它们是在所谓的临时表空间中作为磁盘上的数据文件存在的普通表(pg_default或者您可以在postgresql.conf文件中设置它)。但是他们只使用所谓的temp_buffers - 它们没有加载到shared_buffers中。因此,您必须正确设置temp_buffers并依赖Linux缓存。正如你已经提到的那样 - autovacuum daemon"没有看到"他们。因此我们后来改用普通表。