第 56.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子目录中可以找到额外的方法。