2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5

第 59 章. 編寫表取樣方法

PostgreSQLTABLESAMPLE 子句的實現,除了支援 SQL 標準要求的 BERNOULLISYSTEM 方法外,還支援自定義的表取樣方法。當使用 TABLESAMPLE 子句時,取樣方法決定了哪些錶行將被選中。

在 SQL 層面,表取樣方法由一個單獨的 SQL 函式表示,通常用 C 實現,其簽名如下:

method_name(internal) RETURNS tsm_handler

該函式的名稱與 TABLESAMPLE 子句中出現的的方法名稱相同。internal 引數是一個佔位符(值始終為零),它僅用於防止該函式直接從 SQL 命令中呼叫。函式的返回值必須是一個 palloc 分配的 TsmRoutine 型別結構體,該結構體包含指向取樣方法支援函式的指標。這些支援函式是普通的 C 函式,在 SQL 層面不可見也無法呼叫。支援函式在第 59.1 節 中進行了描述。

除了函式指標,TsmRoutine 結構體還必須提供以下附加欄位:

List *parameterTypes

這是一個 OID 列表,包含當使用此取樣方法時 TABLESAMPLE 子句將接受的引數的資料型別 OID。例如,對於內建方法,此列表包含一個值為 FLOAT4OID 的項,代表取樣百分比。自定義取樣方法可以有更多或不同的引數。

bool repeatable_across_queries

如果為 true,則當提供相同的引數和 REPEATABLE 種子值,並且表內容未發生更改時,取樣方法可以在連續查詢中提供相同的樣本。當此值為 false 時,REPEATABLE 子句不得與此取樣方法一起使用。

bool repeatable_across_scans

如果為 true,則取樣方法可以在同一查詢中的連續掃描中提供相同的樣本(假設引數、種子值和快照不變)。當此值為 false 時,規劃器將不會選擇需要掃描取樣表多次的計劃,因為這可能會導致查詢輸出不一致。

TsmRoutine 結構體型別宣告在 src/include/access/tsmapi.h 中,更多詳細資訊請參見該檔案。

標準發行版中包含的表取樣方法是編寫自己的方法的良好參考。請檢視源樹的 src/backend/access/tablesample 子目錄以瞭解內建取樣方法,並檢視 contrib 子目錄以瞭解附加方法。

提交更正

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