14.2. 访问方法和操作符表

pg_am 表为每个索引访问方法都包含一条记录. 对普通表的访问方法的支持内建于 PostgreSQL,但所有访问方法在 pg_am 里都有描述. 我们可以通过定义要求的接口过程并在 pg_am 里创建一个行的办法增加一个索引访问方法 --- 但那些远远超出了本章 的内容。

一个索引访问方法的过程并不直接知道任何该访问方法将要操作的 数据类型的信息。而是操作符表表明访问方法在操作特定 数据类型的时候需要使用的操作集合。操作符表的名称由来是因为它们 声明的一件事情是一种索引可以使用的 WHERE 子句的操作符集(也就是说 可以转化成一个索引扫描条件)。一个操作符表也可以声明一些索引访问 方法需要的内部操作的支持过程,但是它们并不直接和可以 与索引一起使用的 WHERE 子句操作符相关。

我们可以为同一个数据类型和索引访问方法定义多个操作符表。 这么做的结果是,我们可以为一种数据类型定义多套索引语义。比如, 一个 B-tree 索引要求为它操作的每种数据类型定义一个排序顺序。 对于一个复数数据类型而言,有一个通过复数绝对值对数据排序的 B-tree 操作符表可能会有用,还有一个是用实部排序,等等。 通常其中一个操作符表会被认为最常用的,并且被标记为该数据类型和索引访问 方法的缺省操作符表。

同样的操作符表名字可以用于多种不同的访问方法(比如,B-tree 和散列访问 方法都有叫 oid_ops 的操作符表),但是每个这样的 表都是一个独立的实体,必须分别定义。