已结束支持的版本: 7.3
历史版本。 PostgreSQL 7.3 已结束支持。 请参阅 当前版本手册.
14.7. 操作符类的特殊特性 #
还有两个操作符类的特殊特性我们尚未讨论,主要是因为它们对默认的 B-树索引访问方法没有多大用处。
通常,把一个操作符声明为操作符类的成员,意味着索引访问方法能够正好检索出满足使用该操作符的 WHERE 条件的行集。例如:
SELECT * FROM table WHERE integer_column < 4;
可以由整数列上的 B-树索引精确满足。但也存在这样的情况:索引只是查找匹配行的不精确向导。例如,如果一个 R-树索引只存储对象的包围盒,那么它就无法精确满足测试多边形等非矩形对象之间重叠的 WHERE 条件。不过,我们可以用索引找出包围盒与目标对象的包围盒重叠的对象,然后只对索引找到的对象做精确的重叠测试。如果适用这种情形,就称该索引对该操作符是“有损”的,此时我们在 CREATE OPERATOR CLASS
命令的 OPERATOR 子句中加上 RECHECK。如果索引保证返回所有需要的元组(可能还外加一些额外的元组,它们可以通过执行原始操作符比较来排除),RECHECK 就是合法的。
再次考虑只在索引中存储多边形等复杂对象的包围盒的情况。此时,在索引条目中存储整个多边形没有多少价值,不如只存储一个更简单的对象,其类型为box。这种情况由STORAGE选项表达,该选项位于CREATE OPERATOR CLASS:可以写成如下形式:
CREATE OPERATOR CLASS polygon_ops
DEFAULT FOR TYPE polygon USING gist AS
...
STORAGE box;
目前,只有 GiST 访问方法支持与列数据类型不同的STORAGE类型。GiST 的compress和decompress支持例程在使用STORAGE时必须处理数据类型转换。