PostgreSQL 對 TABLESAMPLE
子句的實現,除了支援 SQL 標準要求的 BERNOULLI
和 SYSTEM
方法外,還支援自定義的表取樣方法。當使用 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
子目錄以瞭解附加方法。
如果您在文件中發現任何不正確、與您對特定功能的使用經驗不符或需要進一步澄清的內容,請使用此表單報告文件問題。