想象一下,我在 Postgres 13 中有一张这样的表:
CREATE TABLE public.people (
id integer PRIMARY KEY,
full_name character varying(255),
bio text
);
然后我插入一行,其中包含足够的字符,以便将 bio 写入 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
最后,我在不更改 TOAST 列的情况下更新该行:
# update people set full_name='jane user' where id=1;
UPDATE 1
是否UPDATE
更改了关联 TOAST 表中的任何行(或根本需要任何写入)?
上下文:我正在处理一些每秒有数千个事务的数据库表,并且观察到服务器上的写入负载非常高。我想知道UPDATE
s 是否在 TOAST 中具有大值的元组,但 TOAST 值本身大部分没有变化会导致写入负载,值得优化。
手册中有明确的答案:
UPDATE
这是overDELETE
+的主要好处之一INSERT
(同时写入新的行版本)。