CREATE OPERATOR CLASS

CREATE OPERATOR CLASS

定义一个新的运算符类。

概要

CREATE OPERATOR CLASS name [DEFAULT] FOR TYPE data_type  
  USING index_method [ FAMILY family_name ] AS
  { OPERATOR strategy_number operator_name [ ( op_type, op_type ) ] [ FOR SEARCH | FOR ORDER BY sort_family_name ]
  | FUNCTION support_number funcname (argument_type [, ...] )
  | STORAGE storage_type
  } [, ... ]

描述

CREATE OPERATOR CLASS创建一个新的运算符类。 运算符类定义如何将特定数据类型与索引一起使用。 运算符类指定某些运算符将为此数据类型和此索引方法填充特定角色或策略。 当为索引列选择了运算符类时,运算符类还指定了索引方法要使用的支持过程。 在创建运算符类之前,必须定义运算符类使用的所有运算符和函数。 用于实现运算符类的任何函数都必须定义为IMMUTABLE

CREATE OPERATOR CLASS目前不检查运算符类定义是否包括所有由索引方法所需的运算符和函数, 也不检查运算符和函数是否构成一个一致的集合。 定义有效的运算符类是用户的责任。

您必须是超级用户才能创建运算符类。

参数

name
要定义的运算符类的名称(可以由模式指定)。 同一模式中的两个运算符类仅在用于不同的索引方法时才可以使用相同的名称。
DEFAULT
使运算符类成为其数据类型的默认运算符类。 对于特定的数据类型和索引方法,最多可以使用一个运算符类作为默认值。
data_type
此运算符类的列数据类型。
index_method
此运算符类用于的索引方法的名称。 选项为btreebitmapgist
family_name
要添加此运算符类的现有运算符符族的名称。 如果未指定,则使用与运算符类相同的名称族(如果尚不存在,则创建它)。
strategy_number
与运算符类关联的运算符由策略编号标识,该策略编号用于标识每个运算符在其运算符类的上下文中的语义。 例如,B树对键施加严格的排序,从小到大,因此对于B树来说,类似小于和大于或等于的运算符更有吸引力。 可以将这些策略视为广义运算符。 每个运算符类指定针对特定数据类型和索引语义解释的每个策略对应的实际运算符。 每种索引方法的相应策略编号如下:
Table 1. B树和位图策略
操作 策略编号
小于 1
小于等于 2
等于 3
大于等于 4
大于 5
Table 2. GiST二维策略(R树)
操作 策略编号
严格左边 1
不延伸到右边 2
覆盖 3
不延伸到左边 4
严格右边 5
相同 6
包含 7
被包含 8
不延伸到上边 9
严格下边 10
严格上边 11
不延伸到下边 12
sort_family_name
现有btree运算符族的名称(可以由模式指定), 用于描述与排序运算符关联的排序顺序。
如果未指定FOR SEARCHFOR ORDER BY,则默认为FOR SEARCH
operator_name
与运算符类关联的运算符的名称(可以由模式指定)。
op_type
OPERATOR子句中,运算符的操作数数据类型,或NONE表示左一元或右一元运算符。 在正常情况下,与运算符类的数据类型相同时,可以省略操作数数据类型。
FUNCTION子句中, 如果与函数的输入数据类型(用于B树比较函数和哈希函数)或类的数据类型(用于B树排序支持函数以及GiST,SP-GiST和GIN运算符类中的所有函数)不同, 则函数要支持的操作数数据类型。 这些默认值是正确的,因此,除了B树排序支持函数旨在支持跨数据类型比较的情况外, 无需在FUNCTION子句中指定op_type
support_number
索引方法为了工作需要额外的支持例程。 这些操作是索引方法在内部使用的管理例程。 与策略一样,运算符类标识对于给定的数据类型和语义解释,哪些特定函数应扮演这些角色中的每一个。 索引方法定义了所需的函数集,运算符类通过将它们分配给支持函数编号来标识要使用的正确函数,如下所示:
Table 3. B树和位图支持函数
函数 支持编号
比较两个键并返回小于零,零或大于零的整数, 指示第一个键是否小于,等于或大于第二个键。 1
Table 4. GiST Support Functions
函数 支持编号
consistent - 确定键是否满足查询限定符。 1
union - 计算一组键的并集。 2
compress - 计算要索引的键或值的压缩表示形式。 3
decompress - 计算压缩键的解压缩表示。 4
penalty - 计算使用给定子树的键将新键插入子树的代价。 5
picksplit - 确定一个页面的条目将被移动到新的页面,并计算联合键结果页面。 6
equal - 比较两个键,如果相等则返回true。 7
funcname
函数的名称(可以由模式指定),该函数是运算符类的索引方法支持过程。
argument_types
函数的参数数据类型。
storage_type
实际存储在索引中的数据类型。 通常,这与列数据类型相同,但是某些索引方法(当前为GiST和GIN)允许其不同。 除非索引方法允许使用其他类型,否则必须省略STORAGE子句。

注解

因为索引机制在使用函数之前不会检查对函数的访问权限,所以在运算符类中包括函数或运算符就等同于对其授予公共执行权限。 对于在运算符类中有用的各种函数,这通常不是问题。

运算符不应由SQL函数定义。 SQL函数很可能内联到调用查询中,这将阻止优化器识别查询与索引匹配。

用于实现运算符类的任何函数都必须定义为IMMUTABLE

在Greenplum数据库6.0之前,OPERATOR子句可以包含RECHECK选项。 此选项不再支持。 Greenplum数据库现在可以确定索引运算符是否在运行时是“有损的”。 这允许在一个运算符可能是或者可能不是有损的情况下有效地处理。

示例

以下示例命令为数据类型_int4(int4的数组)定义了GiST索引运算符类。 有关完整的示例,请参见intarray contrib模块。

CREATE OPERATOR CLASS gist__int_ops
    DEFAULT FOR TYPE _int4 USING gist AS
        OPERATOR 3 &&,
        OPERATOR 6 = (anyarray, anyarray),
        OPERATOR 7 @>,
        OPERATOR 8 <@,
        OPERATOR 20 @@ (_int4, query_int),
        FUNCTION 1 g_int_consistent (internal, _int4, int, oid, internal),
        FUNCTION 2 g_int_union (internal, internal),
        FUNCTION 3 g_int_compress (internal),
        FUNCTION 4 g_int_decompress (internal),
        FUNCTION 5 g_int_penalty (internal, internal, internal),
        FUNCTION 6 g_int_picksplit (internal, internal),
        FUNCTION 7 g_int_same (_int4, _int4, internal);

兼容性

CREATE OPERATOR CLASS是Greenplum数据库扩展。 SQL标准中没有CREATE OPERATOR CLASS语句。