14.3. 访问方法策略

和一种操作符表相关联的操作符是通过"策略号"标识的, 策略号用于标识每种操作符在它的操作符表环境里的语义。 比如,B-tree 对键字有严格的排序要求,小于到大于,因此,象"小于""大于或等于"这样的操作符都是 B-tree 所感兴趣的。 因为 PostgreSQL 语序用户定义操作符, PostgreSQL 无法查看操作符的名字 (比如,<>=)就明白它进行的比较是什么。 实际上,索引访问方法定义了一套"策略",它可以看作时一般性的操作符。 每种操作符表显示对于特定数据类型,是哪种实际操作符对应每种策略, 以及解释索引的语义。

B-tree 索引定义了 5 种策略.在 Table 14-1 中显示。

Table 14-1. B-tree 策略

操作索引
小于1
小于或等于2
等于3
大于或等于4
大于5

散列索引只表示按位的相似性,因此它们只定义了一个策略, 在 Table 14-2 里显示。

Table 14-2. 散列索引

操作策略号
等于1

R-tree 索引表达方形包含关系。它们定义了 8 个策略, 在 Table 14-3 里显示。

Table 14-3. R-tree 策略

操作策略号
在...左边1
在...左边或者重叠2
重叠3
在...右边或者重叠4
在...右边5
相同6
包含7
被包含8

GiST 索引甚至更加灵活:它们根本就没有固定地策略集。实际上,是 特定 GiST 操作符表地"一致性"支持过程解释策略号是什么样子。

顺便提一下,pg_am 里地 amorderstrategy 字段告诉我们该访问方式是否支持排序的扫描。零意味着它不支持; 如果它支持,amorderstrategy 是对应该排序操作符 的策略号。比如,B-tree 的 amorderstrategy = 1, 是它的"小于"的策略号。

简而言之,一个操作符表必须声明一套操作符,这套操作符为该操作符表 的数据类型表达所有这些语义概念。