Postgresql
更新未更改的列是否有害?
假設我有一個包含一些列的表:
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
- 就像索引列根本不參與更新一樣。