Postgresql
為 UPDATE 編寫的 TOAST 行是否不會更改 TOASTable 列?
想像一下,我在 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
操作期間,未更改欄位的值通常保持原樣;因此UPDATE
,如果沒有任何外線值發生變化,則具有外線值的一行不會產生 TOAST 成本。
UPDATE
這是overDELETE
+的主要好處之一INSERT
(同時寫入新的行版本)。