Postgresql之VACUUM和VACUUM FULL对比

VACUUM命令存在两种形式,VACUUM和VACUUM FULL,它们之间的区别见如下表格:


无VACUUM


VACUUM


VACUUM FULL


删除大量数据之后


只是将删除数据的状态置为已删除,该空间不能记录被重新使用。


如果删除的记录位于表的末端,其所占用的空间将会被物理释放并归还操作系统。如果不是末端数据,该命令会将指定表或索引中被删除数据所占用空间重新置为可用状态,那么在今后有新数据插入时,将优先使用该空间,直到所有被重用的空间用完时,再考虑使用新增的磁盘页面。


不论被删除的数据是否处于数据表的末端,这些数据所占用的空间都将被物理的释放并归还于操作系统。之后再有新数据插入时,将分配新的磁盘页面以供使用。


执行效率


由于只是状态置为操作,因此效率较高。


在当前版本的PostgreSQL(v9.1)中,该命令会为指定的表或索引重新生成一个数据文件,并将原有文件中可用的数据导入到新文件中,之后再删除原来的数据文件。因此在导入过程中,要求当前磁盘有更多的空间可用于此操作。由此可见,该命令的执行效率相对较低。


被删除的数据所占用的物理空间是否被重新规划给操作系统。


不会


不会



在执行VACUUM命令时,是否可以并发执行针对该表的其他操作。


由于该操作是共享锁,因此可以与其他操作并行进行。


由于该操作需要在指定的表上应用排它锁,因此在执行该操作期间,任何基于该表的操作都将被挂起,知道该操作完成。


推荐使用方式


在进行数据清空时,可以使用truncate操作,因为该操作将会物理的清空数据表,并将其所占用的空间直接归还于操作系统。


为了保证数据表的磁盘页面数量能够保持在一个相对稳定值,可以定期执行该操作,如每天或每周中数据操作相对较少的时段。


考虑到该操作的开销,以及对其他错误的排斥,推荐的方式是,定期监控数据量变化较大的表,只有确认其磁盘页面占有量接近临界值时,才考虑执行一次该操作。即便如此,也需要注意尽量选择数据操作较少的时段来完成该操作。


执行后其它操作的效率


对于查询而言,由于存在大量的磁盘页面碎片,因此效率会逐步降低。


相比于不执行任何VACUUM操作,其效率更高,但是插入的效率会有所降低。


在执行完该操作后,所有基于该表的操作效率都会得到极大的提升。

by 波罗

原文地址:https://www.cnblogs.com/niubaba/p/9541246.html

时间: 2024-11-02 10:30:10

Postgresql之VACUUM和VACUUM FULL对比的相关文章

[评测]低配环境下,PostgresQL和Mysql读写性能简单对比

[评测]低配环境下,PostgresQL和Mysql读写性能简单对比 原文链接:https://www.cnblogs.com/blog5277/p/10658426.html 原文作者:博客园--曲高终和寡 *******************如果你看到这一行,说明爬虫在本人还没有发布完成的时候就抓走了我的文章,导致内容不完整,请去上述的原文链接查看原文**************** 由于最近经过朋友启发,又有了一个写个人项目的小想法,在这次个人项目中准备学习并使用一些之前自己没有掌握的新

postgresql数据库和mysql数据库的对比分析

1.Posgresql是进程模式,多进程,单线程,类似的还有Oracle.而MYSQL采用的是线程模式,单进程,多线程,对此,大家在运行数据库的时候可以查看任务管理器,SQL Server也是如此. 众所周知,多进程,进程模式,利用CPU时间片轮转,可以利用更充分CPU,因此光拿多核单台机器上来说,他明显在支持高并发性能方面更胜一筹.而线程模式呢,开一个线程显然要比开一个进程所耗费的资源要少,另外在不同线程之间的环境转换和访问公用的存储区域,显然比在不同进程之间要快,所以它的处理速度要快,对资源

Greenplum 调优--VACUUM系统表

1.VACUUM系统表原因 Greenplum是基于MVCC版本控制的,所有的delete并没有删除数据,而是将这一行数据标记为删除, 而且update其实就是delete加insert.所以,随着操作越来越多,表的大小也会越来越大.对于OLAP 应用来说,大部分表都是一次导入后不再修改,所以不会出现这个问题. 但是对于数据字典来说,就会随着时间表越来越大,其中的数据垃圾越来越多. 2.Greenplum的VACUUM工具 Greenplum的VACUUM工具,可以回收已经删除行占据的存储空间.

How vacuum template0

[[email protected] ~]$ vacuumdb --freeze template0 vacuumdb: could not connect to database template0: FATAL: database "template0" is not currently accepting connections [[email protected] ~]$ psql template0 psql: FATAL: database "template0&

PostgreSQL并发控制(显式锁定)

三.显式锁定 PostgreSQL提供了多种锁模式用于控制对表中数据的并发访问.这些模式可以用于在MVCC无法给出期望行为的场合.同样,大多数PostgreSQL命令自动施加恰当的锁以保证被引用的表在命令的执行过程中不会以一种不兼容的方式被删除或者修改. 比如,在存在其它并发操作的时候,TRUNCATE是不能在同一个表上面执行的. 要检查数据库服务器里所有当前正在被持有的锁,可以使用pg_locks系统视图.有关监控锁管理器子系统状态的更多信息,请参考章Chapter 27. 下面的列表显示了可

PostgreSQL的并发控制

9.3中文文档:http://58.58.27.50:8079/doc/html/9.3.1_zh/mvcc.html 参考博客:中文:http://www.zlovezl.cn/articles/postgresql-concurrency-with-mvcc/ 英文:https://devcenter.heroku.com/articles/postgresql-concurrency 本文描述PostgreSQL数据库系统在多个会话试图同时访问同一数据时的表现.并发控制的目标是为所有会话提

postgresql之ctid的浅谈

ctid: 表示数据记录的物理行当信息,指的是 一条记录位于哪个数据块的哪个位移上面. 跟oracle中伪列 rowid 的意义一样的:只是形式不一样. 例如这有个一表test:查看每行记录的ctid情况 mydb=> select ctid,* from test; ctid | id | name -------+------+-------- (0,1) | 1001 | lottu (0,2) | 1002 | rax (0,3) | 1003 | xuan (0,4) | 1004 |

浅谈PostgreSQL的索引

1. 索引的特性 1.1 加快条件的检索的特性 当表数据量越来越大时查询速度会下降,在表的条件字段上使用索引,快速定位到可能满足条件的记录,不需要遍历所有记录. create table t(id int, info text); insert into t select generate_series(1,10000),'lottu'||generate_series(1,10000); create table t1 as select * from t; create table t2 a

数据库并发事务控制四:postgresql数据库的锁机制二:表锁

在博文<数据库并发事务控制四:postgresql数据库的锁机制 > http://blog.csdn.net/beiigang/article/details/43302947 中后面提到: 常规锁机制可以参考pg的官方手册,章节和内容见下面 13.3. Explicit Locking http://www.postgresql.org/docs/9.4/static/explicit-locking.html 这节分为:表锁.行锁.页锁.死锁.Advisory锁(这个名字怎么翻译好???