注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风轻扬

活着就是为了追求幸福

 
 
 

日志

 
 
关于我

关注互联网应用架构、分布式与海量数据处理技术、云计算、数据库技术

网易考拉推荐

PostgreSQL 8.3新特性: HOT  

2007-10-09 22:11:40|  分类: PostgreSQL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
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技术,需要仔细设置表的填充因子,为每个页面预留出足够的空闲空间。
关于HOT的详细说明可以看这里

BTW: 上一次我已经介绍过HOT,但当时PostgreSQL还在早期开发阶段,HOT的功能还没有完全成形。当时HOT是称作Heap Overflow Tuple的,虽然主要的目的还是减少UPDATE带来的问题,但当时的设想还是大不相同。
  评论这张
 
阅读(1729)| 评论(3)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017