--PG并没有像Oracle那样的undo来存放旧版本;而是将旧版本直接存放于relation文件中。那么带来的问题就是dead tuple过多,导致relation文件不断增大而带来空间膨胀问题。
--为了解决这个问题,PG中引入了vacuum后台进程,专门来清理这些dead tuple,并回缩空间
--创建测试数据
postgres=# create table t (id int ,name varchar(50));
CREATE TABLE
postgres=# insert into t select id,'rudy'|| id from generate_series(1,100) id;
--查询统计信息,可知n_live_tup为100,n_dead_tup为0
postgres=# select relname,n_live_tup,n_dead_tup from pg_stat_user_tables where relname='t';
-[ RECORD 1 ]-----+-------
relid | 88968
schemaname | public
relname | t
seq_scan | 0
seq_tup_read | 0
idx_scan |
idx_tup_fetch |
n_tup_ins | 100
n_tup_upd | 0
n_tup_del | 0
n_tup_hot_upd | 0
n_live_tup | 100
n_dead_tup | 0
last_vacuum |
last_autovacuum |
last_analyze |
last_autoanalyze |
vacuum_count | 0
autovacuum_count | 0
analyze_count | 0
autoanalyze_count | 0
--由以下可知,没更新一次,n_dead_tup加1
postgres=# update t set name='dead tuple' where id=1;
UPDATE 1