考虑我有一个应用服务器:
DROP
上没有COMMIT
')。以上意味着我可能 N “永久”数据库会话“持有” N 临时表,只有在重新启动服务器时才会删除它。
我很清楚autovacuum守护程序无法访问这些临时表。
我的问题是,如果我从临时表中经常INSERT
和DELETE
,并且这些表应该“存活”很长时间,那么我是否需要删除后手动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
。
答案 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"没有看到"他们。因此我们后来改用普通表。