| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 11. 索引 | Fast Forward | Next |
一次索引定義可以為索引的每個字串聲明一個 操作符資料表(operator class)。
CREATE INDEX name ON table (column opclass [, ...]);這個操作符資料表標識該索引用於該字串要使用的操作符。 例如,一個在int4上的 B-tree 索引將使用 int4_ops 資料表; 這個操作符資料表包括用於int4的比較函數。 實際上,該字串類型的預設操作符通常就足夠了。 擁有操作符資料表的原因是:對於某些資料類型,可能存在多於一個有意義的索引行為。 例如,我們可能想排序兩個複數,既可能透過絕對值, 也可能透過實部。我們可以透過為該資料類型定義兩個操作符資料表,然後在建立索引時選擇合適的一個來實現這個目的。
除了預設的以外,還有一些有內置的操作符資料表:
操作符資料表 text_pattern_ops,varchar_pattern_ops, bpchar_pattern_ops,和 name_pattern_ops 分別支援在類型 text,varchar,char,和 name 上的 B-tree 索引。他們與初始的操作符資料表的區別是數值是嚴格地一個一個字元比較的, 而不是根據區域相關的集合規則進行比較。 這樣,如果伺服器不使用標準的 "C" 區域設置, 那麼這些操作符資料表適合用於那些涉及模式匹配(LIKE 或者 POSIX 正則資料表達式)資料表達式的查詢。 舉一個例子,您可以像下面這樣對一個 varchar 字串進行索引:
CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
如果您 確實使用了 C 區域,那麼您可以建立一個使用預設操作符資料表的索引, 而即使這樣,它也會對模式匹配查詢有用。 還要注意的是,如果您希望那些涉及到普通比較的查詢也使用索引, 那麼您應該建立用預設操作符資料表的索引。這樣的查詢不能使用 xxx_pattern_ops 操作符資料表。系統允許在同一個字串上建立多個使用不同操作符資料表的索引。
下面的查詢顯示所有已定義的操作符資料表:
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;