忙碌的桌子没有被打扫


11

我们在Windows上使用Postgres 9.2来存储低频时间序列数据:我们每周7天,每24小时每秒每秒插入约2000行,而没有停机。DELETE每隔10分钟左右在表上运行一次,以将表的长度保持固定的天数。最终是相当稳定的9亿行。(对于那些有兴趣,SELECTINSERTDELETE都是高性能)。

因此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

4
请参见PostgreSQL上的Aggressive Autovacuumselect * from pg_stat_user_tables该表也将很有趣(\x在psql中使用,以得到格式良好的输出)
DanielVérité2014年

2
该链接很有帮助,也许可以回答问题-桌子太忙了,无法进行自动真空工作。@DanielVérité我已经用您要求的输出更新了问题。
巴里

3
那是很多死元组!如果可能,请考虑按时间戳对表进行分区,然后删除旧分区而不是删除。主要警告是不支持跨分区的唯一索引。
DanielVérité2014年

1
日志文件中是否有有关此表上的自动真空的消息被取消?
jjanes 2014年

@jjanes否-日志中没有迹象表明曾经启动过autovacuum。
巴里2014年

Answers:


2

我会研究分区。如果按天分区,一旦分区太旧,您可以删除整个分区。您甚至可能不再需要清理。

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

这正是分区的目的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.