创建操作符类

    描述

    CREATE OPERATOR CLASS 创建一个新的操作符类。操作符类定义了能和索引一起使用的特殊的数据类型。该操作符类指定了某些操作符将填充此数据类型和索引方法的特定角色和策略。当操作符类被选定给索引列时,操作符类也指定索引方法所使用的支持的程序。操作符类所使用的所有操作符和函数必须在操作符创建之前就进行定义。用于实现操作符类的所有函数必须被定义为IMMUTABLE(不可改变的)。

    CREATE OPERATOR CLASS 目前不检查操作符类定义是否包括是否包括索引方法所需要的所有的操作符和函数。也不检查是否操作符和函数形成自我一致的集合。定义有效的操作符类是用户的责任。

    用户必须是超级用户才能创建操作符类。

    name

    要定义的操作符类的(可选方案限定)的名称。同一模式中的两个操作符只有在不同索引方法时才具有相同的名称。

    DEFAULT

    为其数据类型制定默认的操作符类。对于一个特定类型的数据类型和索引方法,最多可以指定一个默认操作符类。

    data_type

    该操作符类对应的列数据类型。

    index_method

    strategy_number

    与操作符类相关联的操作符由 策略号来标识,用于在操作符类的上下文中识别每个操作符的语义。例如,B树对关键字施加了严格的排序,从小到大,因此 小于大于或者等于 的操作符对于B树来说是有趣的。这些策略可以被认为是广义的操作符,每个操作符针对特定数据类型指定与每个策略相符的实际操作符和索引语义的解释。每个指标的相应策略编号如下:

    operator_name

    和操作符类相关的操作符的(可选方案限定)名称。

    op_type

    操作符的操作数数据类型, 或 NONE 表示左一元或右一元操作符。该操作数数据类型一般情况下,在与操作符数据类型相同的情况下,可以省略操作数数据类型。

    RECHECK

    如果存在的话,则该索引对该操作符是“有损的”,因此必须重新检查使用索引检索过的行,以验证他们实际上满足涉及该操作符的限定子句。

    support_number

    索引方法需要额外的支持例程才能工作。这些操作是索引方法在内部使用的管理例程。与策略一样,该操作符类指定了哪些特定的函数应该为给定的数据类型和语义解释去使用这些角色。索引方法定义了所需的函数集合,操作符通过将他们分配支持函数号 来识别需要的正确的函数。如下所示:

    函数的(可选方案限定)名称,该函数是支持操作符类的程序的索引方法。

    argument_types

    该函数的参数数据类型

    storage_type

    该数据类型实际上存储在索引中,通常这与列数据类型相同,但是GIST索引方法允许它不同。必须省略 STORAGE 子句,除非索引方法允许使用不同的类型。

    注意

    因为索引机制在使用函数之前不检查它们的访问权限,包括在操作符类中的函数和操作符与授予它的公共执行权限相同。这对于在操作符类中有用的各种函数通常不是问题。

    操作符不应该由SQL函数定义。调用查询中可能会嵌入SQL函数,这会阻止优化程序识别出查询与索引匹配。

    用于实现操作符类的任何函数必须定义为 IMMUTABLE。

    接下来的例子命令定义了数据类型_int4(int4的数组)的GiST 索引操作符类:

    1. DEFAULT FOR TYPE _int4 USING gist AS
    2. OPERATOR 3 &&,
    3. OPERATOR 6 = RECHECK,
    4. OPERATOR 8 <@,
    5. FUNCTION 1 g_int_consistent (internal, _int4, int4),
    6. FUNCTION 3 g_int_compress (internal),
    7. FUNCTION 4 g_int_decompress (internal),
    8. FUNCTION 5 g_int_penalty (internal, internal, internal),

    兼容性

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

    上级话题: