PostgreSQL 8.3新特性: HOT

PostgreSQL最近发布了8.3 Beta,在我看来其中HOT是这一版本最大的亮点之一,简要记录如下。


大家知道PostgreSQL使用多版本技术,对记录的更新操作都会产生一个新版本,版本之间从老到新形成一条版本链。此外更新操作不但会在堆中产生记录的新版本,在表的每个索引中也会产生新版本的索引记录。即对一条记录的每个版本都有对应版本的索引记录,即使更新操作没有修改索引属性,也会在每个索引中都产生一个新版本。这一技术的问题是浪费存储空间,老旧版本占用的空间只有在进行VACUUM时老能被回收,增加的数据库的负担。


为减轻这一问题,PostgreSQL 8.3中加入了HOT技术。使用HOT后,若所有索引属性都没被修改(索引键是否修改是在执行时逐行判断的,因此若一条UPDATE语句修改了某属性,但前后值相同则认为没有修改),且新版本与原版本存储在一个页面上则不会产生新的索引记录,因此这些记录被称为HOT(Heap Only Tuple)。HOT会被打上HEAP_ONLY_TUPLE标志,而HOT的上一个版本则被打上HEAP_HOT_UPDATED标志。当通过索引获取记录时首先会找到同一页中最老的拥有HEAP_ONLY_TUPLE标志的版本,然后顺着版本链向后找,直到遇到HOT为止。限制HEAP_ONLY_TUPLE版本与HOT在同一页的目的是为了通过版本链向后找时不产生额外的IO操作从而影响到性能。因此HOT技术消除了拥有完全相同键值的索引记录,减小了索引大小。


同时,由于HOT版本没有对应的索引记录,可以实现老旧版本的即时回收。一个页中最老的HEAP_ONLY_TUPLE版本失效(即该版本太老了,对所有事务不可见)时该版本的内容将被删除,代替为一个指向下一版本的链接。该页中的其它版本失效时其内容将被释放。一个页上的所有版本都失效后最老的HEAP_ONLY_TUPLE版本被标记为失效,下次VACUUM时将被回收,在此之前不能回收这一版本。


为使得老旧版本回收的空间能够用于插入新版本,PostgreSQL还实现了即时的页内碎片整理。虽然版本失效时会释放空间,这些空间通常是不连续的,无法用于插入新版本。为此在访问拥有HOT的页面且页内空闲空间(这里指可用于插入新版本的空间)太少时将进行页内碎片整理,即将所有空闲页面合并成一块大的可用于插入新版本的空闲空间。


据第三方评测,采用HOT技术能够大幅提高某些UPDATE操作密集型数据库应用的性能,并且能够有效防止存储容易增长。


但HOT也有一些限制:
1. 只有在所有索引属性都没有被更新时才能使用HOT,这里的索引属性不但包括存储在某个索引中的属性,也包括某个部分索引定义中用到的属性。因此只要有一个被更新的属性是索引属性,HOT就会完全失效;
2. 只有在被更新记录所在页面能够存储新版本时才能用HOT,因此为了能够有效利用HOT技术,需要仔细设置表的填充因子,为每个页面预留出足够的空闲空间。
详细介绍该技术:http://www.pgcon.org/2008/schedule/events/105.en.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值