9.3 9.4 9.5 9.6 10 11 12
阿里云PostgreSQL 问题报告 纠错本页面

章 55. 编写表采样方法

除了SQL标准所需的BERNOULLISYSTEM方法之外, PostgreSQLTABLESAMPLE子句的实现还支持自定义表抽样方法。 当使用TABLESAMPLE子句时,抽样方法确定将选择表的哪些行。

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

method_name(internal) RETURNS tsm_handler

函数的名称与出现在TABLESAMPLE子句中的方法名称相同。 internal参数是虚拟的(总是零),它仅仅用于防止从SQL命令直接调用此函数。 函数的结果必须是类型为TsmRoutine的palloc'd结构, 它包含抽样方法的支持函数的指针。这些支持函数是纯C函数, 在SQL级别不可见或可调用。支持函数在第 55.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子目录中查看附加方法。

<
/BODY >