我们有一个行相对较大(10-40kb)的表,我们必须经常更新此表中的单个整数列。
据我所知,PostgreSQL中的UPDATE
是DELETE+INSERT
的事务(由于MVCC)。
这意味着PostgreSQL将删除并重新插入整行,即使我只想更新一个整数(不需要额外的空间)。
我想知道是否可以在不删除和重新插入行的情况下执行UPDATE
操作“
答案 0 :(得分:0)
只需要复制存储在线的字段。对于TOAST表中存储的外部字段,仅复制对TOAST条目的引用。
字段是否存储在线外取决于字段中值的大小以及字段的数据类型。
如果元组很大但只有几个字段 - 比如
some_id integer,
frequently_updated integer,
charblob text
然后由于frequently_updated
的更新通常会重写charblob
中的数据,因此更改任何内容都没有多大意义,至少如果它的大小足以使其变为{&1}}值得关注。
OTOH,如果你有一个包含大量字段的表,那么每次更新都会重写更多。
HOT只会在有限的范围内为您提供帮助,因为只有当没有更新的列是索引的一部分时才会发生HOT更新并且在其上有足够的可用空间数据库页面。对于宽行,即使使用TOAST,您也不会在页面上放置多个副本,因此HOT的效益有限。
如果这些字段经常更新,将这些字段分成单独的表格是值得的,但表格的其余部分有很多不会发生太大变化的行。