赞
踩
在Postgresql做delete操作时,数据集(也叫做元组 (tuples))是没有立即从数据文件中移除的,仅仅是通过在行头部设置xmax做一个删除标记。
update操作也是一样的,在postgresql中可以看作是先delete再insert;
这是Postgresql MVCC的基本思想之一,因为它允许在不同进程之间只进行最小的锁定就可以实现更大的并发性。这个MVCC实现的缺点当然是它会留下被标记删除的 元组( dead tuples),即使在这些版本的所有事务完成之后。
如果不清理掉那些dead tuples(对任何事务都是不可见的)将会永远留在数据文件中,浪费磁盘空间,对于表来说,有过多的删除和更新,dead tuples很容易占绝大部分磁盘空间。而且dead tuples也会在索引中存在,更加加重磁盘空间的浪费。这是在PostgreSQL中常说的膨胀(bloat)。数据库臃肿是数据库服务器性能不佳的主要原因之一,dead tuples数据过多,造成表相关update/deletion操作性能下降,同时查询也会变慢。如果过于频繁会造成cpu和磁盘读写的繁忙,同样会造成性能问题。
autovacuum是postgresql数据库是一个后台进程,在默认配置下,随数据库自启动。自动清理会检查被大量插入、更新或删除元组的表。是一个非常频繁的操作。
1、清理表中的过期死元组
2、防止业务表膨胀
3、更新表的统计信息以供优化器使用
4、autovacuum launcher使用stats collector后台进程收集统计信息来确定autovacuum候选列表
autovacuum会做两件事件:一是vacuum,二是analyze。
1.功能
清理过程相当简单,它从数据文件中读取页面(默认8kB数据块),并检查它是否需要清理.如果没有死元组,页面就会被丢弃而不做任何更改.否则它被清理(死元组被删除)
2.清理比较值
更新或删除的元组数。
失效元组的数量从统计信息收集器获得,它是一个半准确的计数(它只是半准确,是因为在高负载的情况下某些信息可能会丢失)。
3.死亡元组数查询
select relid,schemaname,relname,n_dead_tup from pg_stat_user_tables;
4.触发条件
清理阈值 = 清理基本阈值 + 清理缩放系数 * 元组数
5.配置参数
① 清理基本阈值:autovacuum_vacuum_threshold,默认值为50
② 清理缩放系数:autovacuum_vacuum_scale_factor,默认值0.2
1.功能
更新查询计划器使用的统计信息以选择或选择执行查询的最有效计划。
ANALYZE的效率稍差,因为VACUUM的成本与死元组的数量成正比(当很少/没有时成本比较低),ANALYZE必须在每次执行时从头开始重建统计数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。