本章說明核心 PostgreSQL 系統和表存取方法之間的介面,後者管理表的儲存空間。核心系統對這些存取方法的了解很少,超出此處指定的內容,因此可以通過編寫附加程式碼來開發全新的存取方法類型。
每個表存取方法都由 pg_am
系統目錄中的一行描述。pg_am
項目指定了表存取方法的名稱和處理函數。可以使用 CREATE ACCESS METHOD 和 DROP ACCESS METHOD SQL 命令建立和刪除這些項目。
必須將表存取方法處理函數宣告為接受 internal
類型的一個參數,並傳回偽類型 table_am_handler
。該參數是一個虛擬值,僅用於防止處理函數直接從 SQL 命令呼叫。函數的結果必須是指向 TableAmRoutine
類型結構的指標,其中包含核心程式碼需要了解的所有內容才能使用表存取方法。傳回值需要是伺服器生命週期,這通常通過將其定義為全域範圍中的 static const
變數來實現。TableAmRoutine
結構,也稱為存取方法的 API 結構,使用回呼定義存取方法的行為。這些回呼是指向純 C 函數的指標,並且在 SQL 層級不可見或不可呼叫。所有回呼及其行為都在 TableAmRoutine
結構中定義(結構內有註解定義回呼的需求)。大多數回呼都有包裝函式,這些函式從表存取方法的使用者(而不是實作者)的角度進行說明。有關詳細資訊,請參閱 src/include/access/tableam.h
檔案。
要實作存取方法,實作者通常需要實作一個AM- 特定類型的元組表槽(請參閱 src/include/executor/tuptable.h
),允許存取方法外部的程式碼持有對 AM 元組的引用,並存取元組的欄位。
目前,AM 實際儲存資料的方式相當不受限制。例如,可以使用 postgres 的共享緩衝區快取,但不是必需的。如果使用它,使用 PostgreSQL 的標準頁面佈局可能是有意義的,如 第 65.6 節 中所述。
表存取方法 API 的一個相當大的限制是,目前,如果 AM 想要支援修改和/或索引,則每個元組都必須具有元組識別碼 (TID),它由區塊編號和項目編號組成(另請參閱 第 65.6 節)。並非絕對需要TID的子部分具有與例如 heap
相同含義,但如果需要位元圖掃描支援(這是可選的),則區塊編號需要提供位置。
為了實現崩潰安全性,AM 可以使用 postgres 的 WAL,或自訂實作。如果選擇WAL,則可以使用 通用 WAL 記錄,或可以實作 自訂 WAL 資源管理器。
為了以允許在單個交易中存取不同表存取方法的方式實作交易支援,可能需要與 src/backend/access/transam/xlog.c
中的機制緊密整合。
任何新的 table access method
的開發人員都可以參考 src/backend/access/heap/heapam_handler.c
中現有的 heap
實作,以了解其詳細實作。
如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步說明的內容,請使用 此表單 回報文件問題。