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

第 58 章。撰寫表格取樣方法

PostgreSQLTABLESAMPLE 子句實作除了 SQL 標準要求的 BERNOULLISYSTEM 方法之外,還支援自訂表格取樣方法。取樣方法決定使用 TABLESAMPLE 子句時將選取表格中的哪些列。

在 SQL 層級,表格取樣方法由單一 SQL 函式表示,通常以 C 語言實作,具有以下簽章:

method_name(internal) RETURNS tsm_handler

函式的名稱與 TABLESAMPLE 子句中出現的方法名稱相同。internal 引數是一個虛擬引數(始終具有值零),僅用於防止從 SQL 命令直接呼叫此函式。函式的結果必須是類型為 TsmRoutine 的 palloc'd struct,其中包含指向取樣方法支援函式的指標。這些支援函式是普通的 C 函式,並且在 SQL 層級不可見或不可呼叫。支援函式在第 58.1 節中描述。

除了函式指標之外,TsmRoutine struct 還必須提供以下額外欄位

List *parameterTypes

這是一個 OID 清單,其中包含使用此取樣方法時 TABLESAMPLE 子句將接受的參數的資料類型 OID。例如,對於內建方法,此清單包含一個值為 FLOAT4OID 的項目,它代表取樣百分比。自訂取樣方法可以有更多或不同的參數。

bool repeatable_across_queries

如果 true,則如果每次提供相同的參數和 REPEATABLE 種子值,並且表格內容沒有變更,則取樣方法可以在連續查詢中傳遞相同的樣本。當此值為 false 時,REPEATABLE 子句不接受與取樣方法一起使用。

bool repeatable_across_scans

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

TsmRoutine struct 類型在 src/include/access/tsmapi.h 中宣告,請參閱該檔案以取得更多詳細資訊。

標準發行版中包含的表格取樣方法是嘗試撰寫自己的方法時的良好參考。請查看原始程式碼樹的 src/backend/access/tablesample 子目錄以取得內建取樣方法,以及 contrib 子目錄以取得附加方法。

提交更正

如果您在說明文件中看到任何不正確、與特定功能的使用體驗不符或需要進一步澄清的內容,請使用此表單來回報說明文件問題。