# 64.2.B-树算子类的行为

如图所示表38.3,一个btree运算符类必须提供五个比较运算符,<,<=,=,>=>.有人可能会这么想<>也应该是运算符类的一部分,但不是,因为使用<>索引搜索中的WHERE子句。(出于某些目的,规划者会<>与btree运算符类关联;但它通过=操作员的否定器链接,而不是来自阿莫普.)

当几个数据类型共享几乎相同的排序语义时,它们的运算符类可以分组到一个运算符族中。这样做是有利的,因为它允许规划者对跨类型比较进行推断。族中的每个运算符类都应包含其输入数据类型的单一类型运算符(以及相关的支持函数),而跨类型比较运算符和支持函数在族中是“松散”的。建议在族中包含一组完整的交叉类型运算符,从而确保规划器能够表示从传递性推导出的任何比较条件。

btree运算符族必须满足以下一些基本假设:

  • =算子必须是等价关系;也就是说,对于所有非空值*A.*, B, *C*数据类型:

    • A. = *A.*这是真的(反思法)

    • 如果*A.* = B然后B = A. (对称律)

    • 如果*A.* = BB = C然后A. = C (传递律)

  • A.<算子必须是强序关系;也就是说,对于所有非空值*A.*, B, C:

    • A. < *A.*这是假的(不可逆律)

    • 如果*A.* < BB < C然后A. < C (传递律)

  • 此外,排序是总的;也就是说,对于所有非空值*A.*, B:

    • 正是其中之一*A.* < B, A. = BB < *A.*这是真的(三分律)

      (当然,三分法证明了比较支持函数的定义是正确的。)

    其他三个操作符是根据=<以显而易见的方式,并且必须始终如一地采取行动。

    对于支持多种数据类型的操作员系列,当*A.*, B, *C*从族中的任何数据类型中获取。传递定律是最难确保的,因为在交叉类型的情况下,它们代表着两个或三个不同运算符的行为是一致的。举个例子,把浮动8数字的到同一个操作符族中,至少与当前的语义不同数字的值被转换为浮动8用来和浮动8.因为数据的准确性有限浮动8,这意味着数字的将进行比较的值等于浮动8价值,因此传递定律将失败。

    多数据类型族的另一个要求是,在运算符族中包含的数据类型之间定义的任何隐式或二进制强制转换都不得更改关联的排序顺序。

    应该很清楚为什么btree索引要求这些规则在单个数据类型中保持不变:没有它们,就没有排列键的顺序。此外,使用不同数据类型的比较键进行索引搜索时,需要在两种数据类型之间进行比较,以便表现正常。btree索引机制本身并不严格要求对一个族中的三种或更多数据类型进行扩展,但规划者依赖它们进行优化。