忙碌的桌子没有被吸尘

Bar*_*rry 11 postgresql vacuum

我们在 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在each之后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       | *
Run Code Online (Sandbox Code Playgroud)

和原始输出:

-[ 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
Run Code Online (Sandbox Code Playgroud)

SQB*_*SQB 2

我会研究分区。如果按天分区,一旦整个分区变得太旧,您就可以删除它。您甚至可能不再需要吸尘。

此外,整体性能可能会提高,因为您没有在要删除的位置插入。您只需要编写代码来创建新分区并删除旧分区。

这正是分区的目的。