本章解釋了核心 PostgreSQL 系統與管理表儲存的表訪問方法之間的介面。除了此處規定的內容外,核心系統對這些訪問方法瞭解甚少,因此可以透過編寫附加程式碼來開發全新的訪問方法型別。
每個表訪問方法都由 pg_am
系統目錄中的一行來描述。 pg_am
條目指定了表訪問方法的名稱和一個處理函式。可以使用 CREATE ACCESS METHOD 和 DROP ACCESS METHOD SQL 命令來建立和刪除這些條目。
表訪問方法處理函式必須宣告接受一個 internal
型別的引數,並返回偽型別 table_am_handler
。該引數是一個啞值,僅用於阻止從 SQL 命令直接呼叫處理函式。
擴充套件 SQL 指令碼檔案可能像這樣建立表訪問方法處理函式:
CREATE OR REPLACE FUNCTION my_tableam_handler(internal) RETURNS table_am_handler AS 'my_extension', 'my_tableam_handler' LANGUAGE C STRICT; CREATE ACCESS METHOD myam TYPE TABLE HANDLER my_tableam_handler;
函式的結果必須是指向 TableAmRoutine
型別結構的指標,該結構包含核心程式碼用於使用表訪問方法的所有資訊。返回值需要是伺服器生命週期內的,這通常透過將其定義為全域性範圍內的 static const
變數來實現。
包含表訪問方法處理函式的原始檔可能看起來像這樣:
#include "postgres.h" #include "access/tableam.h" #include "fmgr.h" PG_MODULE_MAGIC; static const TableAmRoutine my_tableam_methods = { .type = T_TableAmRoutine, /* Methods of TableAmRoutine omitted from example, add them here. */ }; PG_FUNCTION_INFO_V1(my_tableam_handler); Datum my_tableam_handler(PG_FUNCTION_ARGS) { PG_RETURN_POINTER(&my_tableam_methods); }
TableAmRoutine
結構,也稱為訪問方法的API 結構,使用回撥定義訪問方法的行為。這些回撥是指向普通 C 函式的指標,在 SQL 級別不可見或不可呼叫。所有回撥及其行為都在 TableAmRoutine
結構中定義(結構內的註釋定義了回撥的要求)。大多數回撥都有包裝函式,這些函式從表訪問方法的使用者的角度(而不是實現者的角度)進行記錄。有關詳細資訊,請參閱 src/include/access/tableam.h
檔案。
要實現一個訪問方法,實現者通常需要實現一個AM特定的元組表槽(tuple table slot)(參見 src/include/executor/tuptable.h
),它允許訪問方法外部的程式碼持有對 AM 元組的引用,並訪問元組的列。
目前,AM 實際儲存資料的方式相當寬鬆。例如,可以使用 postgres 的共享緩衝區快取,但並非強制要求。如果使用,那麼使用 PostgreSQL 的標準頁面佈局(如 第 66.6 節中所述)可能是有意義的。
表訪問方法 API 的一個相當大的限制是,目前,如果 AM 希望支援修改和/或索引,那麼每個元組必須有一個元組識別符號(TID),由塊號和項號組成(另請參見 第 66.6 節)。TID 的子部分不一定具有與 heap
相同的含義,但如果需要點陣圖掃描支援(這是可選的),則塊號需要提供區域性性。TIDs具有與 heap
相同的含義,但如果需要點陣圖掃描支援(它是可選的),則塊號需要提供區域性性。
為了崩潰安全,AM 可以使用 postgres 的 WAL,或者自定義實現。如果WAL被選中,可以使用 通用 WAL 記錄,也可以實現 自定義 WAL 資源管理器。
要以允許在單個事務中訪問不同表訪問方法的方式實現事務支援,可能需要與 src/backend/access/transam/xlog.c
中的機制緊密整合。
任何新的 table access method
的開發者都可以參考現有 heap
實現(位於 src/backend/access/heap/heapam_handler.c
)以獲取其實現的詳細資訊。
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。