On this page
Chapter 58.编写表采样方法
目录
PostgreSQL 的TABLESAMPLE
子句实现除 SQL 标准所需的BERNOULLI
和SYSTEM
方法外,还支持自定义表采样方法。采样方法确定使用TABLESAMPLE
子句时将选择表的哪些行。
在 SQL 级别,表采样方法由单个 SQL 函数表示,该函数通常以 C 语言实现,具有签名
method_name(internal) RETURNS tsm_handler
该函数的名称与TABLESAMPLE
子句中出现的方法名称相同。 internal
参数是一个虚拟变量(始终具有零值),仅用于防止直接从 SQL 命令调用此函数。函数的结果必须是类型为TsmRoutine
的 palloc 结构,其中包含支持采样方法功能的指针。这些支持函数是普通的 C 函数,在 SQL 级别不可见或不可调用。支持功能在Section 58.1中描述。
除了函数指针之外,TsmRoutine
结构还必须提供以下其他字段:
List *parameterTypes
- 这是一个 OID 列表,其中包含使用此采样方法时
TABLESAMPLE
子句将接受的参数的数据类型 OID。例如,对于内置方法,此列表包含一个值为FLOAT4OID
的单个项目,该值表示采样百分比。自定义采样方法可以具有更多或不同的参数。
- 这是一个 OID 列表,其中包含使用此采样方法时
bool repeatable_across_queries
- 如果
true
,并且每次都提供相同的参数和REPEATABLE
种子值并且表内容未更改,则采样方法可以在连续查询中提供相同的 samples。如果为false
,则不接受REPEATABLE
子句与抽样方法一起使用。
- 如果
bool repeatable_across_scans
- 如果
true
,则采样方法可以在同一查询的连续扫描中提供相同的 samples(假设参数,种子值和快照不变)。如果为false
,那么计划者将不会选择需要多次扫描采样表的计划,因为这可能会导致查询输出不一致。
- 如果
TsmRoutine
结构类型在src/include/access/tsmapi.h
中声明,有关其他详细信息,请参见。
当尝试编写自己的表时,标准发行版中包含的表抽样方法是很好的参考。在源树的src/backend/access/tablesample
子目录中查找内置的采样方法,在contrib
子目录中查找附加方法。