為了實現高併發,PostgreSQL 使用 多版本併發控制 (MVCC) 來儲存行。然而,MVCC對更新查詢有一些不利影響。具體來說,更新需要將行的最新版本新增到表中。這還可能需要為每個更新的行建立新的索引條目,並且刪除舊版本的行及其索引條目可能成本很高。
為了幫助減少更新的開銷,PostgreSQL 有一個名為僅堆元組 (HOT) 的最佳化。當滿足以下條件時,此最佳化是可能的:
更新不修改由表索引引用的任何列,不包括彙總索引。核心 PostgreSQL 發行版中唯一的彙總索引方法是 BRIN。
包含舊行的頁面上有足夠的可用空間容納更新後的行。
在這種情況下,僅堆元組提供了兩個最佳化:
更新的行不需要新的索引條目,但是,彙總索引可能仍需要更新。
當一行被多次更新時,除了最舊和最新的行版本之外的其他行版本可以在正常操作(包括 SELECT
s)期間被完全刪除,而無需進行定期的 VACUUM 操作。(索引始終引用原始行版本的 頁面項識別符號。與該行版本關聯的元組資料被刪除,其項識別符號被轉換為指向可能仍對某些併發事務可見的最舊版本的重定向。不再對任何人可見的中間行版本被完全刪除,並且關聯的頁面項識別符號可供重用。)
您可以透過減小表的 fillfactor
來增加用於HOT更新的頁面空間的可能性。如果您不這樣做,HOT更新仍將發生,因為新行自然會遷移到新頁面,並且現有頁面將有足夠的可用空間容納新行版本。系統檢視 pg_stat_all_tables 允許監控 HOT 和非 HOT 更新的發生情況。
如果您在文件中看到任何不正確、與您對特定功能的經驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。