PostgreSQL 的 TABLESAMPLE
子句实现支持自定义表抽样方法,除了 SQL 标准要求的 BERNOULLI
和 SYSTEM
方法。抽样方法确定在使用 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
子目录中查找附加方法。
如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单报告文档问题。