PG 的 HOT 什麼時候會失效?

兩份材料對 HOT(Heap Only Tuple) 的預設剛好相反,而兩邊都沒講清楚它什麼時候成立、什麼時候不成立。這則筆記把問題留著。

兩種相反的預設

來源它把 HOT 當成原話
建索引的代價是毫秒,收益可能是秒(Victor Gardini 的 EXPLAIN 指南)常態「只改無關欄位時 PostgreSQL 的 HOT 機制可能連索引都不用碰」
這篇 MySQL vs PG 的分析註腳主線是「所有索引都要更新指向新位置」,HOT 只是「可以緩解此問題,但仍有限制」

兩者差別不小:若 HOT 是常態,PG 的寫入放大來自位置過期,不是欄位變動 就被大幅削弱;若 HOT 常失效,那條規則就是 PG 的日常成本。

要查清楚的

  • HOT 成立的完整條件是什麼?(我的推論是「新版本要能放進同一個 page 的剩餘空間」+「沒有改到任何索引欄位」,但這是推論,不是材料說的)
  • fillfactor 設定與 HOT 的關係?為什麼調低 fillfactor 會被建議?
  • 一旦同頁塞不下,是整串 HOT chain 斷掉還是只有這次失效?
  • 實務上怎麼觀測 HOT 命中率?(pg_stat_user_tables.n_tup_hot_upd?)

結案條件

讀到 PostgreSQL 官方文件的 HOT 章節,或自己做一次實測(同一張表分別改索引欄位/非索引欄位,比對 n_tup_hot_upd)。結案後回來修正上面兩篇的說法。