2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 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 结构体,其中包含指向抽样方法支持函数的指针。这些支持函数是普通的 C 函数,在 SQL 级别不可见或不可调用。支持函数在第 58.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 子目录以获取附加方法。

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用此表单报告文档问题。