Postgresql

為 UPDATE 編寫的 TOAST 行是否不會更改 TOASTable 列?

  • October 26, 2021

想像一下,我在 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 表中的任何行(或根本需要任何寫入)?

上下文:我正在處理一些每秒有數千個事務的數據庫表,並且觀察到伺服器上的寫入負載非常高。我想知道UPDATEs 是否在 TOAST 中具有大值的元組,但 TOAST 值本身大部分沒有變化會導致寫入負載,值得優化。

手冊中有明確的答案

UPDATE操作期間,未更改欄位的值通常保持原樣;因此UPDATE,如果沒有任何外線值發生變化,則具有外線值的一行不會產生 TOAST 成本。

UPDATE這是over DELETE+的主要好處之一INSERT(同時寫入新的行版本)。

引用自:https://dba.stackexchange.com/questions/301662