vacuum命令详解

VACUUM收回由死亡元组占用的存储空间。在通常的PostgreSQL操作中,被删除或者被更 新废弃的元组并没有在物理上从它们的表中移除,它们将一直存在直到一次VACUUM被执 行。因此有必要周期性地做VACUUM,特别是在频繁被更新的表上。

一般来说,vacuum对指定的表进行以下操作:
删除死元组:
删除每页上的死元组和对活动元组进行碎片整理。
删除指向死元组的索引元组。

冻结旧的txid:
如有必要,请冻结元组的旧文本。
更新冻结的与txid相关的系统目录(pg_database和pg_class)。
如果可能,请删除clog中不必要部分。

其他:
更新已处理表的FSM和VM。
更新几个统计信息(pg_stat_all_tables等)。

语法:

Syntax:
VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]

where option can be one of:

    FULL [ boolean ]
    FREEZE [ boolean ]
    VERBOSE [ boolean ]
    ANALYZE [ boolean ]
    DISABLE_PAGE_SKIPPING [ boolean ]
    SKIP_LOCKED [ boolean ]
    INDEX_CLEANUP [ boolean ]
    TRUNCATE [ boolean ]

and table_and_columns is:

    table_name [ ( column_name [, ...] ) ]

需要注意的是,vacuum命令不能在事务中执行,vacuum 不加参数是对所有表进行操作。
主要说明下vacuum和vacuum full这两个命令区别:

  1. vacuum不会锁表,只是单纯的回收空间以被重用,被回收的空间一般情况不会被返还给操作系统,仅仅被保留在同一个表中以备重用。
  2. vacuum full会锁表,会将表的整个内容重写到一个新的磁盘文件中,并且不包含额外的空间,这使得没有被 使用的空间被还给操作系统。

例子:
–创建实验表

bill=# select count(*) from test ;
  count   
----------
 10000000
(1 row)

bill=# \dt+ test;
                  List of relations
 Schema | Name | Type  | Owner |  Size  | Description 
--------+------+-------+-------+--------+-------------
 public | test | table | bill  | 651 MB | 
(1 row)

–删除表中数据并vacuum
可以发现表大小没变。

bill=# delete from test where id<>10000000;
DELETE 9999999
bill=# vacuum test;
VACUUM
bill=# \dt+ test  
                  List of relations
 Schema | Name | Type  | Owner |  Size  | Description 
--------+------+-------+-------+--------+-------------
 public | test | table | bill  | 651 MB | 
(1 row)

–vacuum full该表
可以发现表所占空间已经被回收。

bill=# vacuum full test;
VACUUM
bill=# \dt+ test        
                  List of relations
 Schema | Name | Type  | Owner | Size  | Description 
--------+------+-------+-------+-------+-------------
 public | test | table | bill  | 16 kB | 
(1 row)

还有一点需要注意的是,vacuum full甚至会改变relfilenode(relfilenode 是用来命名数据文件的,会随数据物理位置变化而变化),但是vacuum full不会生成fsm和vm文件。

bill=# select relname,relfilenode from pg_class where relname = 't1'; 
 relname | relfilenode 
---------+-------------
 t1      |      190368
(1 row)
bill=# vacuum FULL t1;
VACUUM
bill=# select relname,relfilenode from pg_class where relname = 't1'; 
 relname | relfilenode 
---------+-------------
 t1      |      190379
(1 row)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值