有人可以解释VACUUM
PostgreSQL中这些类型之间的区别吗?
我读了文档,但是它只是说FULL
锁定表并FREEZE
“冻结”元组。我认为是一样的。我错了吗?
有人可以解释VACUUM
PostgreSQL中这些类型之间的区别吗?
我读了文档,但是它只是说FULL
锁定表并FREEZE
“冻结”元组。我认为是一样的。我错了吗?
Answers:
这是一个简短的简短答案。
真空完全清除将排它锁并重建表,使其没有空块(我们现在假设填充因子为100%)。
真空冻结使用非常特殊的事务时间戳标记表的内容,该时间戳告诉postgres永远不需要对其进行清理。下次更新时,此冻结的ID将消失。
例如,template0数据库被冻结,因为它永远不会更改(默认情况下,您无法连接到它)。
autovacuum守护程序每隔一段时间就会检查数据库及其表,以查看需要清除的内容。如果对表进行真空冻结,然后再不对其进行更新,则autovacuum守护程序将简单地通过它。同样,postgresql中的“环绕”保护也永远不会在该表上生效。
tl; dr冻结将表标记为不需要任何autovac维护。下次更新将解冻它。
VACUUM FREEZE
需要在表上使用排他锁?似乎应该如此,否则您可能会冒着使活动交易中的行突然变为全局可见的风险。我可能会误会它……
进一步解释Jayadevan撰写的内容。
Postgres处理事务以及跟踪可见数据的方式是通过比较内部事务ID。但是,由于这些事务迟早是32位整数,因此它们会回绕,因此新事务看起来就像过去所做的(因此在当前事务中可见,而在不应该的情况下可见),而较旧的交易看起来像是将来要完成的交易(并且由于将来还不存在,因此该数据将不再可见)。
为了解决该问题,Postgres所做的工作是为每行足够旧的行分配一个可能受此环绕影响的特殊交易ID,该ID总是比每笔交易都要老。您可以看到它,好像有效的事务ID的范围是0到2147483647,它将所有当前行的事务ID设置为-1。
但是,由于真空基本上是为了标记可重复使用的空白空间,因此它仅适用于已更改的数据页。
什么VACUUM FREEZE
做的基本上是冻结所有页面的事务ID,无论他们是否已被修改或没有,所以当前所有的行都将被视为旧新的交易记录。
但是,自8.2版VACUUM FREEZE
起已弃用,不应使用。而是有参数vacuum_freeze_table_age
,该参数autovacuum_freeze_max_age
指定在对表进行完整扫描之前(可以对表进行内部扫描)可以发生多少事务VACUUM FREEZE
。
VACUUM FREEZE
已过时/已淘汰的情况如何?
当我问相同的问题时,从答案中复制/粘贴-“常规真空标记了空白空间以供重用,并在关系结束时回收了空白空间。因此,如果空白空间位于中间等,则不能回收只是重复使用。
vacuum full压缩了一个回收所有空白空间的关系。因此,它需要排他锁,因此对生产系统不利。
因此,REGULAR vacuum的目的不是从表中回收空间,而是使其在以后可重复使用。FULL FULL的目的是回收所有浪费的空间,同时以排他的锁和数据库性能为代价。
因此,由于常规真空不是为了回收所有内容而设计的,因此,您实际上没有回收所有内容就不会感到惊讶。在具有更多随机删除等功能的较大数据集上进行实验,以查看常规真空和完全真空之间的差异。”
http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html
除此之外,vacuum full实际上将为该表创建新文件(现有文件的大小将缩小为0)。因此,OS可以回收空间。
VACUUM FREEZE
特别要求。