# 第 58 章编写表格抽样方法
目录
PostgreSQL 的实现表样
子句支持自定义表采样方法,除了伯努利
和系统
SQL 标准要求的方法。抽样方法决定了当表样
使用了子句。
在 SQL 级别,表采样方法由单个 SQL 函数表示,通常用 C 实现,具有签名
method_name(internal) RETURNS tsm_handler
函数的名称与出现在表样
条款。这内部的
参数是一个哑元(总是具有零值),它只是用来防止从 SQL 命令直接调用此函数。函数的结果必须是类型为 palloc 的结构Tsm例程
,其中包含用于支持采样方法的函数的指针。这些支持函数是纯 C 函数,在 SQL 级别不可见或不可调用。支持功能在第 58.1 节.
除了函数指针,Tsm例程
struct 必须提供这些附加字段:
列出 *parameterTypes
这是一个 OID 列表,其中包含将被接受的参数的数据类型 OID表样
使用这种抽样方法时的条款。例如,对于内置方法,此列表包含一个具有值的项目浮动4OID
,代表抽样百分比。自定义采样方法可以有更多或不同的参数。
bool repeatable_across_queries
如果真的
,采样方法可以在连续查询中提供相同的样本,如果相同的参数和可重复
每次都提供种子值,并且表格内容没有改变。当这是错误的
, 这可重复
子句不被接受与抽样方法一起使用。
bool repeatable_across_scans
如果真的
,采样方法可以在同一查询中的连续扫描中提供相同的样本(假设参数、种子值和快照不变)。当这是错误的
,计划程序将不会选择需要多次扫描采样表的计划,因为这可能会导致查询输出不一致。
这Tsm例程
结构类型声明在src/include/access/tsmapi.h
,请参阅以获取更多详细信息。
标准分布中包含的表格抽样方法在尝试编写自己的方法时是很好的参考。调查src/后端/访问/tablesample
内置采样方法的源树的子目录,并进入贡献
附加方法的子目录。