vacuum full + analyze 方案
一、背景
在数据库中,那些已经delete的元组或者被update过后的元组只是被标记为删除状态,并没有从它们所属的表中物理删除;在完成vacuum操作之前他们仍然存在,该部分空间是不能被重用的。数据库总是不断地在执行删除、更新等操作,会产生大量的磁盘页面碎片,不但占用空间,而且会逐渐降低查询的效率。因此,良好的空间管理非常重要,能够对性能带来大幅提高。
二、Vacuum+analyse的用法及原理
2.1 Vacuum的作用
数据库中用于维护数据库磁盘空间的工具是vacuum,其重要作用是删除那些已经标示为删除的数据并释放空间。因此我们有必要周期地运行vacuum,特别是在常更新的表上。
Vacuum有两种形式:vacuum与vacuum full,区别如下
Vacuum |
Vacuum full |
|
空间清理 |
如果删除的记录位于表的末端,其所占用的空间将会被物理释放并归还操作系统。而如果不是末端数据,会将表中或索引中dead tuple(死亡元组)所占用的空间置为可用状态,从而复用这些空间。 |
不论被清理的数据处于何处,这些数据锁占用的空间将被物理释放并归还于操作系统。当再有数据插入后,分配新的磁盘页面使用。 |
锁类型 |
共享锁(4级) share update exclusive, 不会影响表的增删改查。 |
排他锁(8级) Access Exclusive, 执行期间,基于该表的操作全部挂起。 |
物理空间 |
不会释放 |
会释放 |
事务ID |
不回收 |
回收 |
执行开销 |
开销较小,可以定期执行 |