PG的物化视图膨胀问题
Tags: PGPostgreSQL物化视图膨胀
序言
今天在②群有位筒子提了这样一个问题:
“
他这个已经超过了 10 行,也超过 50%,但是没有触发自动 vacuum?然后呢,我基于这个 t1 做了个物化视图,然后我发现每次刷新,物化视图查询都不会有死元组
但是生产环境中,物化视图就会有死元组,并且死元组有 200 多万,count(*) 的时候就 2 万多行,这样就需要频繁去 vacuum。那么物化视图他刷新的时候,会重新查询一次,不就拿最新的结果集了么?那怎么生产环境的物化视图会有死元组呢?
下来我也简单看了一下这块的逻辑,涨知识!什么情况下物化视图会导致膨胀?
分析
这个问题其实可以拆解为两个问题,第一个即为什么表没有触发 vacuum。这个问题老生常谈,默认的触发阈值是 autovacuum_vacuum_scale_factor * reltuples + autovacuum_vacuum_threshold,autovacuum_vacuum_threshold 默认值是 50,主要是为了预防小表频繁触发而设置的最低水位线,所以假如表增删改的数量超过了 20% ,就会触发 vacuum,当然实际情况还要取决于是否有空闲 worker,是否能获取到 ShareUpdateExclusiveLock 等等。