我们在Windows上使用Postgres 9.2来存储低频时间序列数据:我们每周7天,每24小时每秒每秒插入约2000行,而没有停机。DELETE
每隔10分钟左右在表上运行一次,以将表的长度保持固定的天数。最终是相当稳定的9亿行。(对于那些有兴趣,SELECT
,INSERT
,DELETE
都是高性能)。
因此DELETE
,在删除行时不会释放磁盘空间。为此,我们需要VACUUM
运行。
我查询,pg_stat_user_tables
并且VACUUM
似乎从未运行过。
我从各种文档(http://www.postgresql.org/docs/9.2/static/routine-vacuuming.html)了解到:
- 我们似乎启用了自动真空,并且它正在其他表上运行。
- auto-vacuum不会运行
FULL
,并且不应在表上要求排他锁。
有谁想到为什么自动真空不运行?这纯粹是因为桌子一直在忙吗?
它是值得的运行VACUUM
后,每DELETE
在这种情况下(其中每10分钟一班)?
编辑:
通过下面的SO链接使用SQL查询:
-[ RECORD 2 ]---+---------------------------
schemaname | stats
relname | statistic_values_by_sec
last_vacuum |
last_autovacuum |
n_tup | 932,315,264
dead_tup | 940,727,818
av_threshold | 186,463,103
expect_av | *
和原始输出:
-[ RECORD 3 ]-----+---------------------------
relid | 501908
schemaname | stats
relname | statistic_values_by_sec
seq_scan | 12
seq_tup_read | 4526762064
idx_scan | 29643
idx_tup_fetch | 2544206912
n_tup_ins | 1573896877
n_tup_upd | 0
n_tup_del | 941176496
n_tup_hot_upd | 0
n_live_tup | 688858417
n_dead_tup | 940727818
last_vacuum |
last_autovacuum |
last_analyze |
last_autoanalyze | 2014-08-09 01:36:21.703+01
vacuum_count | 0
autovacuum_count | 0
analyze_count | 0
autoanalyze_count | 69
该链接很有帮助,也许可以回答问题-桌子太忙了,无法进行自动真空工作。@DanielVérité我已经用您要求的输出更新了问题。
—
巴里
那是很多死元组!如果可能,请考虑按时间戳对表进行分区,然后删除旧分区而不是删除。主要警告是不支持跨分区的唯一索引。
—
DanielVérité2014年
日志文件中是否有有关此表上的自动真空的消息被取消?
—
jjanes 2014年
@jjanes否-日志中没有迹象表明曾经启动过autovacuum。
—
巴里2014年
select * from pg_stat_user_tables
该表也将很有趣(\x
在psql中使用,以得到格式良好的输出)