使用PostgreSQL进行“就地”更新

时间:2015-08-04 14:42:05

标签: postgresql

我们有一个行相对较大(10-40kb)的表,我们必须经常更新此表中的单个整数列。

据我所知,PostgreSQL中的UPDATEDELETE+INSERT的事务(由于MVCC)。

这意味着PostgreSQL将删除并重新插入整行,即使我只想更新一个整数(不需要额外的空间)。

我想知道是否可以在不删除和重新插入行的情况下执行UPDATE操作“

1 个答案:

答案 0 :(得分:0)

只需要复制存储在线的字段。对于TOAST表中存储的外部字段,仅复制对TOAST条目的引用。

字段是否存储在线外取决于字段中值的大小以及字段的数据类型。

如果元组很大但只有几个字段 - 比如

some_id integer,
frequently_updated integer,
charblob text

然后由于frequently_updated的更新通常会重写charblob中的数据,因此更改任何内容都没有多大意义,至少如果它的大小足以使其变为{&1}}值得关注。

OTOH,如果你有一个包含大量字段的表,那么每次更新都会重写更多。

HOT只会在有限的范围内为您提供帮助,因为只有当没有更新的列是索引的一部分时才会发生HOT更新并且在其上有足够的可用空间数据库页面。对于宽行,即使使用TOAST,您也不会在页面上放置多个副本,因此HOT的效益有限。

如果这些字段经常更新,将这些字段分成单独的表格是值得的,但表格的其余部分有很多不会发生太大变化的行。