支援版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11

65.7. 僅堆積元組 (HOT) #

為了實現高並發,PostgreSQL 使用多版本並行控制 (MVCC) 來儲存資料列。然而,MVCC對於更新查詢來說,存在一些缺點。 具體而言,更新需要將資料列的新版本新增到資料表中。這也可能需要為每個更新的資料列新增索引條目,並且移除舊版本的資料列及其索引條目可能很昂貴。

為了幫助減少更新的開銷,PostgreSQL 有一個稱為僅堆積元組 (heap-only tuples,HOTHOT) 的優化。當以下情況發生時,此優化是可行的:

  • 更新不會修改資料表索引所參考的任何欄位,不包括摘要索引。 核心 PostgreSQL 發行版中唯一的摘要索引方法是 BRIN

  • 包含舊資料列的頁面上,有足夠的可用空間容納更新後的資料列。

在這種情況下,僅堆積元組提供兩種優化

  • 不需要新增索引條目來表示更新後的資料列,但是,仍然可能需要更新摘要索引。

  • 當一個資料列被多次更新時,除了最舊和最新的資料列版本之外的其他版本,可以在正常操作期間完全移除,包括 SELECT 語句,而無需定期執行 vacuum 操作。(索引始終參考原始資料列版本的頁面項目識別符。與該資料列版本相關聯的元組資料會被移除,並且其項目識別符會轉換為重定向,指向可能對某些並發交易仍然可見的最舊版本。不再對任何人可見的中間資料列版本會被完全移除,並且相關的頁面項目識別符可以重複使用。)

您可以透過降低資料表的 fillfactor 來增加足夠頁面空間的可能性,以利於HOTHOT 更新。 如果您不這樣做,HOTHOT 更新仍然會發生,因為新的資料列會自然地遷移到新的頁面,以及現有頁面上具有足夠的可用空間來容納新的資料列版本。系統視圖 pg_stat_all_tables 允許監控 HOT 和非 HOT 更新的發生情況。

提交更正

如果您在說明文件中發現任何不正確、與特定功能的使用經驗不符或需要進一步澄清的地方,請使用此表單報告說明文件問題。