Redrock Postgres 搜索 英文
版本: 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

62.3. 可扩展性

BRIN接口具有高级别的抽象, 要求访问方法实现者只实现被访问的数据类型的语义。BRIN 层本身负责并发,记录和搜索索引结构。

获取BRIN访问方法所需的工作是实现一些用户定义的方法, 它们定义存储在索引中的摘要值的行为以及它们与扫描键交互的方式。 简而言之,BRIN将可扩展性与通用性,代码重用和干净的接口相结合。

BRIN的操作符类必须提供四种方法:

BrinOpcInfo *opcInfo(Oid type_oid)

返回有关索引列的摘要数据的内部信息。 返回值必须指向palloc'd BrinOpcInfo,它具有以下定义:

typedef struct BrinOpcInfo
{
    /* Number of columns stored in an index column of this opclass */
    uint16      oi_nstored;

    /* Opaque pointer for the opclass' private use */
    void       *oi_opaque;

    /* Type cache entries of the stored columns */
    TypeCacheEntry *oi_typcache[FLEXIBLE_ARRAY_MEMBER];
} BrinOpcInfo;

BrinOpcInfo.oi_opaque 可以由操作符类例程用来在索引扫描期间在支持过程之间传递信息。

bool consistent(BrinDesc *bdesc, BrinValues *column, ScanKey key)

返回ScanKey是否与范围的给定索引值一致。 要使用的属性编号作为扫描键的一部分传递。

bool addValue(BrinDesc *bdesc, BrinValues *column, Datum newval, bool isnull)

给定索引元组和索引值,修改元组的指示属性,使得它另外表示新值。 如果对元组进行了任何修改,则返回true

bool unionTuples(BrinDesc *bdesc, BrinValues *a, BrinValues *b)

Consolidates two index tuples. Given two index tuples, modifies the indicated attribute of the first of them so that it represents both tuples. The second tuple is not modified. 合并两个索引元组。给定两个索引元组,修改它们中的第一个的指定属性, 使得它表示两个元组。第二个元组不被修改。

核心分布包括对两种类型的运算符类的支持:最小最大和包含。适当时, 将为核心数据类型运送使用它们的运算符类定义。 用户可以使用等效定义为其他数据类型定义附加运算符类,而无需编写任何源代码; 正在宣布的适当目录条目就足够了。注意,关于运算符策略的语义的假设嵌入在支持过程的源代码中。

实现完全不同的语义的操作符类也是可能的,提供上述四个主要支持过程的实现。 请注意,不能保证主要版本之间的向后兼容性:例如, 在较新的版本中可能需要额外的支持过程。

要为实现完全有序集的数据类型编写运算符类, 可以使用minmax支持过程以及相应的运算符, 如表 62-2中所示。 所有运算符类成员(过程和运算符)都是必需的。

表 62-2. 最小最大运算符类的过程和支持编号

运算符类成员对象
支持过程 1内部函数 brin_minmax_opcinfo()
支持过程 2内部函数 brin_minmax_add_value()
支持过程 3内部函数 brin_minmax_consistent()
支持过程 4内部函数 brin_minmax_union()
运算符策略 1小于运算符
运算符策略 2小于等于运算符
运算符策略 3等于运算符
运算符策略 4大于等于运算符
运算符策略 5大于运算符

要为包含在另一个类型中的值的复杂数据类型编写运算符类, 可以使用包含支持过程以及相应的运算符, 如表 62-3中所示。 它只需要一个附加功能,可以用任何语言编写。可以为其他功能定义更多功能。 所有运算符都是可选的。一些操作符需要其他操作符,如表中的依赖关系所示。

表 62-3. 包含操作符类的过程和支持编号

操作符类成员对象依赖
支持过程 1内部函数 brin_inclusion_opcinfo() 
支持过程 2内部函数 brin_inclusion_add_value() 
支持过程 3内部函数 brin_inclusion_consistent() 
支持过程 4内部函数 brin_inclusion_union() 
支持过程 11合并两个元素的函数 
支持过程 12检查两个元素是否可合并的可选函数 
支持过程 13检查一个元素是否包含在另一个中的可选函数 
支持过程 14检查一个元素是否为空的可选函数 
操作符策略 1left-of运算符操作符策略 4
操作符策略 2does-not-extend-to-the-right-of运算符操作符策略 5
操作符策略 3overlaps运算符 
操作符策略 4right-of运算符操作符策略 2
操作符策略 5does-not-extend-to-the-right-of运算符操作符策略 1
操作符策略 6, 18same-as-or-equal-to运算符操作符策略 7
操作符策略 7, 13, 16, 24, 25contains-or-equal-to运算符 
操作符策略 8, 14, 26, 27is-contained-by-or-equal-to运算符操作符策略 3
操作符策略 9does-not-extend-above运算符操作符策略 11
操作符策略 10is-below运算符操作符策略 12
操作符策略 11is-above运算符操作符策略 9
操作符策略 12does-not-extend-below运算符操作符策略 10
操作符策略 20less-than运算符操作符策略 4
操作符策略 21less-than-or-equal-to运算符操作符策略 4
操作符策略 22greater-than运算符操作符策略 1
操作符策略 23greater-than-or-equal-to运算符操作符策略 1

支持程序编号1-10保留用于BRIN内部函数,因此SQL级别函数以编号11开始。 支持函数编号11是构建索引所需的主要函数。 它应该接受与opclass具有相同数据类型的两个参数,并返回它们的并集。 如果使用STORAGE参数定义,则包含opclass可以存储具有不同数据类型的并集。 并集函数的返回值应与STORAGE数据类型匹配。

支持过程编号12和14用于支持内置数据类型的不规则行为。 程序编号12用于支持来自不可合并的不同系列的网络地址。 程序编号14用于支持空范围。程序编号13是可选的,也是推荐的一个, 它允许新值在传递到并集函数之前执行检查。 由于BRAIN框架可以在并集不更改时快速执行某些操作, 因此使用这些函数可以提高索引性能。

最小最大和包含操作符类都支持跨数据类型的操作符, 尽管这些依赖关系变得更加复杂。 最小最大操作符类需要一组完整的操作符来定义两个具有相同数据类型的参数。 它允许通过定义额外的运算符集来支持附加的数据类型。 包含操作符类运算符策略依赖于另一个运算符策略, 如表 62-3中所示, 或与其自身相同的运算符策略。它们需要使用STORAGE 数据类型作为支持的运算符的左侧参数, 而将其他支持的数据类型作为右侧参数来定义依赖性运算符。 请参见float4_minmax_ops作为最小最大的示例, 和box_inclusion_ops作为包含示例。