11.6. 操作符表

一次索引定義可以為索引的每個字段聲明一個 操作符表(operator class)

CREATE INDEX name ON table (column opclass [, ...]);

這個操作符表標識該索引用于該字段要使用的操作符。 例如,一個在int4上的 B-tree 索引將使用 int4_ops 表; 這個操作符表包括用于int4的比較函數。 實際上,該字段類型的缺省操作符通常就足夠了。 擁有操作符表的原因是:對于某些數據類型,可能存在多于一個有意義的索引行為。 例如,我們可能想排序兩個復數,既可能通過絕對值, 也可能通過實部。我們可以通過為該數據類型定義兩個操作符表,然後在建立索引時選擇合適的一個來實現這個目的。

除了缺省的以外,還有一些有內置的操作符表:

下面的查詢顯示所有已定義的操作符表:

SELECT am.amname AS index_method,
       opc.opcname AS opclass_name
    FROM pg_am am, pg_opclass opc
    WHERE opc.opcamid = am.oid
    ORDER BY index_method, opclass_name;

我們可以把它擴展為顯示每個表中的所有操作符:

SELECT am.amname AS index_method,
       opc.opcname AS opclass_name,
       opr.oprname AS opclass_operator
    FROM pg_am am, pg_opclass opc, pg_amop amop, pg_operator opr
    WHERE opc.opcamid = am.oid AND
          amop.amopclaid = opc.oid AND
          amop.amopopr = opr.oid
    ORDER BY index_method, opclass_name, opclass_operator;