为 UPDATE 写入的 TOAST 行是否不会更改 TOASTable 列?

Jam*_*aly 6 postgresql storage update

想象一下,我在 Postgres 13 中有一个像这样的表:

CREATE TABLE public.people (
    id integer PRIMARY KEY,
    full_name character varying(255),
    bio text
);
Run Code Online (Sandbox Code Playgroud)

然后,我插入一行包含足够字符的行,以便将简介写入 TOAST 表:

# insert into people values (1, 'joe user', (SELECT array_to_string(ARRAY(SELECT chr((65 + round(random() * 25)) :: integer) FROM generate_series(1,4000)), '')));
INSERT 0 1
Run Code Online (Sandbox Code Playgroud)

最后,我更新该行而不更改 TOAST 列:

# update people set full_name='jane user' where id=1;
UPDATE 1
Run Code Online (Sandbox Code Playgroud)

是否UPDATE更改关联 TOAST 表中的任何行(或根本需要任何写入)?

上下文:我正在处理一些每秒有数千个事务的数据库表,并且观察到服务器上的写入负载非常高。我想知道UPDATETOAST 中具有较大值但 TOAST 值本身大部分不变的元组是否会增加写入负载并且值得优化。

Erw*_*ter 8

说明书上有明确的答案:

在操作期间UPDATE,未更改字段的值通常按原样保留;因此,UPDATE如果任何异常值都没有发生变化,则具有异常值的行不会产生 TOAST 成本。

UPDATE这是over DELETE+的主要好处之一INSERT(同时写入新的行版本)。

但有一些细则“不变”。看: