VACUUM命令存在两种形式,VACUUM和VACUUM FULL,它们之间的区别见如下表格:
|
无VACUUM |
VACUUM |
VACUUM FULL |
删除大量数据之后 |
只是将删除数据的状态置为已删除,该空间不能记录被重新使用。 |
如果删除的记录位于表的末端,其所占用的空间将会被物理释放并归还操作系统。如果不是末端数据,该命令会将指定表或索引中被删除数据所占用空间重新置为可用状态,那么在今后有新数据插入时,将优先使用该空间,直到所有被重用的空间用完时,再考虑使用新增的磁盘页面。 |
不论被删除的数据是否处于数据表的末端,这些数据所占用的空间都将被物理的释放并归还于操作系统。之后再有新数据插入时,将分配新的磁盘页面以供使用。 |
执行效率 |
|
由于只是状态置为操作,因此效率较高。 |
在当前版本的PostgreSQL(v9.1)中,该命令会为指定的表或索引重新生成一个数据文件,并将原有文件中可用的数据导入到新文件中,之后再删除原来的数据文件。因此在导入过程中,要求当前磁盘有更多的空间可用于此操作。由此可见,该命令的执行效率相对较低。 |
被删除的数据所占用的物理空间是否被重新规划给操作系统。 |
不会 |
不会 |
会 |
在执行VACUUM命令时,是否可以并发执行针对该表的其他操作。 |
|
由于该操作是共享锁,因此可以与其他操作并行进行。 |
由于该操作需要在指定的表上应用排它锁,因此在执行该操作期间,任何基于该表的操作都将被挂起,知道该操作完成。 |
推荐使用方式 |
在进行数据清空时,可以使用truncate操作,因为该操作将会物理的清空数据表,并将其所占用的空间直接归还于操作系统。 |
为了保证数据表的磁盘页面数量能够保持在一个相对稳定值,可以定期执行该操作,如每天或每周中数据操作相对较少的时段。 |
考虑到该操作的开销,以及对其他错误的排斥,推荐的方式是,定期监控数据量变化较大的表,只有确认其磁盘页面占有量接近临界值时,才考虑执行一次该操作。即便如此,也需要注意尽量选择数据操作较少的时段来完成该操作。 |
执行后其它操作的效率 |
对于查询而言,由于存在大量的磁盘页面碎片,因此效率会逐步降低。 |
相比于不执行任何VACUUM操作,其效率更高,但是插入的效率会有所降低。 |
在执行完该操作后,所有基于该表的操作效率都会得到极大的提升。 |
by 波罗