CREATE OPERATOR CLASS
创建操作符类
定义一个新的操作符类。
概要
CREATE OPERATOR CLASS name [DEFAULT] FOR TYPE data_type USING index_method AS { OPERATOR strategy_number op_name [(op_type, op_type)] [RECHECK] | FUNCTION support_number funcname (argument_type [, ...] ) | STORAGE storage_type } [, ... ]
描述
CREATE OPERATOR CLASS 创建一个新的操作符类。操作符类定义了能和索引一起使用的特殊的数据类型。该操作符类指定了某些操作符将填充此数据类型和索引方法的特定角色和策略。当操作符类被选定给索引列时,操作符类也指定索引方法所使用的支持的程序。操作符类所使用的所有操作符和函数必须在操作符创建之前就进行定义。用于实现操作符类的所有函数必须被定义为IMMUTABLE(不可改变的)。
CREATE OPERATOR CLASS 目前不检查操作符类定义是否包括是否包括索引方法所需要的所有的操作符和函数。也不检查是否操作符和函数形成自我一致的集合。定义有效的操作符类是用户的责任。
用户必须是超级用户才能创建操作符类。
参数
- name
- 要定义的操作符类的(可选方案限定)的名称。同一模式中的两个操作符只有在不同索引方法时才具有相同的名称。
- DEFAULT
- 为其数据类型制定默认的操作符类。对于一个特定类型的数据类型和索引方法,最多可以指定一个默认操作符类。
- data_type
- 该操作符类对应的列数据类型。
- index_method
- 该操作符类所对应的索引方法的名称。索引方法有 are btree, bitmap, 和 gist。
- strategy_number
- 与操作符类相关联的操作符由 策略号来标识,用于在操作符类的上下文中识别每个操作符的语义。例如,B树对关键字施加了严格的排序,从小到大,因此 小于 和 大于或者等于 的操作符对于B树来说是有趣的。这些策略可以被认为是广义的操作符,每个操作符针对特定数据类型指定与每个策略相符的实际操作符和索引语义的解释。每个指标的相应策略编号如下:
表 1. B-tree 和 Bitmap 策略 操作 策略号 小于 1 小于等于 2 等于 3 大于等于 4 大于 5 表 2. GiST 二维策略(R-Tree) 操作 策略号 严格在左边 1 不会扩展到右边 2 重叠 3 不会扩展到左边 4 严格在右边 5 相同 6 包含 7 由什么包含 8 不会扩展到上边 9 严格在下 10 严格在上 11 不会扩展到下 12 - operator_name
- 和操作符类相关的操作符的(可选方案限定)名称。
- op_type
- 操作符的操作数数据类型, 或 NONE 表示左一元或右一元操作符。该操作数数据类型一般情况下,在与操作符数据类型相同的情况下,可以省略操作数数据类型。
- RECHECK
- 如果存在的话,则该索引对该操作符是“有损的”,因此必须重新检查使用索引检索过的行,以验证他们实际上满足涉及该操作符的限定子句。
- support_number
- 索引方法需要额外的支持例程才能工作。这些操作是索引方法在内部使用的管理例程。与策略一样,该操作符类指定了哪些特定的函数应该为给定的数据类型和语义解释去使用这些角色。索引方法定义了所需的函数集合,操作符通过将他们分配支持函数号 来识别需要的正确的函数。如下所示:
表 3. B-tree 和 Bitmap 支持函数 函数 支持号 比较两个关键字,返回一个小于0,0或大于0的整数。指示是否第一个值小于,等于或大于第二个值。 1 表 4. GiST 支持函数 函数 支持号 一致 - 确定关键字是否满足查询限定符 1 并集 - 计算关键字集合的并集。 2 压缩 - 计算要索引的键值的压缩表示。 3 解压缩 - 计算压缩关键字的解压缩表示。 4 代价 - 计算用给定的子树键将新的键插入子树的代价 5 picksplit - 确定页面的哪些条目将被移动到新的页面,并计算结果页面的联合关键字。 6 相等 - 比较两个关键字,如果相等,则返回真。 7 - funcname(函数名称)
- 函数的(可选方案限定)名称,该函数是支持操作符类的程序的索引方法。
- argument_types
- 该函数的参数数据类型
- storage_type
- 该数据类型实际上存储在索引中,通常这与列数据类型相同,但是GIST索引方法允许它不同。必须省略 STORAGE 子句,除非索引方法允许使用不同的类型。
注意
因为索引机制在使用函数之前不检查它们的访问权限,包括在操作符类中的函数和操作符与授予它的公共执行权限相同。这对于在操作符类中有用的各种函数通常不是问题。
操作符不应该由SQL函数定义。调用查询中可能会嵌入SQL函数,这会阻止优化程序识别出查询与索引匹配。
用于实现操作符类的任何函数必须定义为 IMMUTABLE。
例子
接下来的例子命令定义了数据类型_int4(int4的数组)的GiST 索引操作符类:
CREATE OPERATOR CLASS gist__int_ops DEFAULT FOR TYPE _int4 USING gist AS OPERATOR 3 &&, OPERATOR 6 = RECHECK, OPERATOR 7 @>, OPERATOR 8 <@, OPERATOR 20 @@ (_int4, query_int), FUNCTION 1 g_int_consistent (internal, _int4, int4), FUNCTION 2 g_int_union (bytea, 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 语句。