14.7. 操作符表的特殊特性

还有两种操作符表的特殊特性我们没有讨论,主要是因为它们 对于缺省的 B-tree 索引访问方法并不非常有用。

通常,把一个操作符声明为一个操作符表的成员意味着索引访问方法 可以使用该操作符检索满足一个 WHERE 条件的行集合。比如,

SELECT * FROM table WHERE integer_column < 4;

可以由一个建立在整数字段上的 B-tree 索引精确地满足。但是有时候 会有这样的现象:索引是用作匹配数据行的并不精确的指向。比如, 如果一个 R-tree 索引只为对象存储周界的方块,那么它就无法精确地 满足一个两个非方形对象(比如多边形)之间是否覆盖的测试。 但是我们可以使用这个索引找出那些周界方块和目标对象的周界方块 重合的对象,然后只在索引找到的对象上做精确的重合测试。如果这种 情形可以通过,那我们就说索引对操作符是"松散的", 并且我们在 CREATE OPERATOR CLASS 命令里给 OPERATOR 子句增加 RECHECK。如果索引保证 返回所有要求的元组加上一些附加的元组,那么 RECHECK 就合法, 这些额外的元组就可以通过执行最初的操作符比较消除。

再考虑我们再索引中只存储复杂对象(比如多边形)的周界方块的情形。 这种情况下我们在索引条目里存储整个多边形没有太多的数值 --- 我们 也可以只存储更简单的类型 box 的对象。 这种情形由 CREATE OPERATOR CLASS 里的 STORAGE 选项存储:我们可以写类似这样的东西

CREATE OPERATOR CLASS polygon_ops
    DEFAULT FOR TYPE polygon USING gist AS
        ...
        STORAGE box;

目前,只有 GiST 访问方法支持与字段数据类型不同的 STORAGE 类型。 GiST compressdecompress 支持过程 在使用 STORAGE 的时候必须处理数据类型转换。