【问题标题】:Are dead rows removed by anything else than vacuum?除了真空之外,死行是否会被清除?
【发布时间】:2018-07-03 14:01:24
【问题描述】:

在 PostgreSQL 9.3.19 日志中,我看到以下两个连续条目用于给定表的 autovacuum:

2018-06-29 17:24:06 CDT 13177 14/870454 0 LOG:  automatic vacuum of table "openbravo.public.ad_session_status": index scans: 0
    pages: 0 removed, 235 remain
    tuples: 0 removed, 14669 remain
    buffer usage: 1090 hits, 673 misses, 4 dirtied
    avg read rate: 6.745 MB/s, avg write rate: 0.040 MB/s

--

2018-06-29 17:24:55 CDT 13529 40/699086 0 LOG:  automatic vacuum of table "openbravo.public.ad_session_status": index scans: 0
    pages: 0 removed, 235 remain
    tuples: 0 removed, 13039 remain
    buffer usage: 1143 hits, 663 misses, 0 dirtied
    avg read rate: 3.086 MB/s, avg write rate: 0.000 MB/s

All autovacuums are logged:log_autovacuum_min_duration=0.

中间没有其他手动吸尘器。

如果这两个真空都没有删除任何死元组,那么剩余的元组数量怎么会在第二个之后减少呢? PostgreSQL 有其他方法来删除死行吗?

【问题讨论】:

  • 您确定这些是连续运行吗?参数log_autovacuum_min_duration的值是多少?
  • @LaurenzAlbe log_autovacuum_min_duration 的值是 0(我在问题中更新了它)。在日志中,这两个条目之间没有该表的其他自动清理,因此我假设它们是连续运行。

标签: postgresql postgresql-9.3 vacuum


【解决方案1】:

一种解释可能是HOT updates

如果表块中有空间并且没有更新的列被索引,PostgreSQL 会将新行版本与原始行版本放在同一块中,并创建一个“HOT 链”,旧行版本指向新行版本。这允许 PostgreSQL 跳过更新所有指向该表行的索引。

除了在UPDATE 期间减少 I/O 之外,HOT 还允许“即时”删除旧的行版本:每当访问几乎已满的页面并且可以获得必要的锁定时,PostgreSQL 将执行通过重组它在该块上“微真空”。

这可能会导致观察到的元组减少。

要支持或反驳这一理论,请运行以下查询:

SELECT n_tup_upd, n_tup_hot_upd
FROM pg_stat_user_tables
WHERE schemaname = 'public' AND relname = 'ad_session_status';

如果n_tup_hot_upd 大于零,我们就有了一个案例。

【讨论】:

  • 虽然现在两者都是 0(同时发生了其他真空),但 HOT 可以解释它。
猜你喜欢
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多