Postgresql

更新未更改的列是否有害?

  • September 27, 2018

假設我有一個包含一些列的表:

CREATE TABLE t
(
   key int PRIMARY KEY,
   c1  int,
   c2  text,
   c3  timestamptz
);

我現在從表中獲取一行:

SELECT * FROM t WHERE id = 180;

在我的應用程序中,我現在只更改一列的值,比如說c2. 這樣做對性能有害嗎:

UPDATE t
SET    t1 = <exact the same value as before>,
      t2 = <new value>,
      t3 = <exact the same value as before>
WHERE  key = 180;

代替:

UPDATE t
SET    t2 = <new value>
WHERE  key = 180;

?

假設可以忽略網路成本(例如,您沒有更新具有相同值的兆字節文本),它不應該影響性能。但是,如果您有UPDATE帶有列列表的觸發器,它們的行為會有所不同,具體取決於該列是否被提及為UPDATE. 例如,

create  trigger test_au after update of t1 on t
   for each row 
   execute procedure after_update_t1();

update t set t2=<new value> where key = 180; -- trigger does not fire
update t set t1=<exact the same value as before>,
t2=<new value> where key = 180; -- trigger does fire 

我還測試了 HOT 更新 - Postgres 10.5 沒有區別。如果索引列的值沒有改變,它只會進行堆更新,至少根據pg_stat_user_tables- 就像索引列根本不參與更新一樣。

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