Postgresql 中文操作指南

Chapter 60. Writing a Table Sampling Method

Table of Contents

PostgreSQL 对 TABLESAMPLE 子句的实现支持自定义表抽样方法,除了 SQL 标准要求的 BERNOULLISYSTEM 方法。抽样方法确定在使用 TABLESAMPLE 子句时选择表的哪些行。

在 SQL 级别,表抽样方法由单个 SQL 函数表示,通常在 C 中实现,具有签名

method_name(internal) RETURNS tsm_handler

函数的名称是出现在 TABLESAMPLE 子句中的相同方法名称。参数 internal 是一个虚拟参数(始终具有零值),简单地阻止此函数直接从 SQL 命令调用。函数的结果必须是类型的 palloc’d 结构 TsmRoutine ,其中包含指向抽样方法的支持函数的指针。这些支持函数是普通的 C 函数,在 SQL 级不可见或不可调用。在 Section 60.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 子目录以了解附加方法。