?
This document uses PHP Chinese website manual Release
定義索引的同時(shí)可以為索引的每個(gè)字段聲明一個(gè)操作符類operator class。
CREATE INDEX name ON table (column opclass [sort options] [, ...]);
這個(gè)操作符類指明該索引用于該字段時(shí)要使用的操作符。 例如,一個(gè)在int4上的B-tree索引將使用int4_ops類;這個(gè)操作符類包括用于int4的比較函數(shù)。 實(shí)際上,字段類型的缺省操作符通常就足夠了。擁有操作符類的主要原因是:對(duì)于某些數(shù)據(jù)類型,可能存在多個(gè)有意義的索引行為。 例如,我們可能想排序兩個(gè)復(fù)數(shù),既可能通過(guò)絕對(duì)值,也可能通過(guò)實(shí)部。我們可以通過(guò)為該數(shù)據(jù)類型定義兩個(gè)操作符類,然后在建立索引時(shí)選擇合適的那個(gè)。 操作符類決定基本的排序順序(通過(guò)添加排序選項(xiàng)ASC/DESC和(或者) NULLS FIRST/NULLS LAST然后進(jìn)行修改)
除了缺省的以外,還有一些有內(nèi)置的操作符類:
text_pattern_ops,varchar_pattern_ops, 和bpchar_pattern_ops操作符類分別支持在text, varchar,和char類型上的B-tree索引。 他們與缺省操作符類的區(qū)別在于數(shù)值是嚴(yán)格地逐個(gè)字節(jié)比較的,而不是根據(jù)區(qū)域相關(guān)的集合規(guī)則進(jìn)行比較。 這樣,如果數(shù)據(jù)庫(kù)不使用標(biāo)準(zhǔn)的"C"區(qū)域設(shè)置, 那么這些操作符類適用于那些涉及模式匹配表達(dá)式(LIKE或者POSIX正則表達(dá)式)的查詢。 舉一個(gè)例子,你可以像下面這樣對(duì)一個(gè)varchar字段進(jìn)行索引:
CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
請(qǐng)注意,相比較使用索引而言,如果你希望包含普通<,<=, >, 或>=, 那么你還應(yīng)該創(chuàng)建一個(gè)使用缺省操作符類的索引。這樣的查詢不能使用xxx_pattern_ops操作符類。 (然而,普通等價(jià)的比較,可以使用這些 操作符類。)允許在同一個(gè)字段上創(chuàng)建多個(gè)使用不同操作符類的索引。 如果你確實(shí)使用了標(biāo)準(zhǔn)的"C"區(qū)域設(shè)置,那么你就不需要xxx_pattern_ops操作符類, 因?yàn)槭褂萌笔〔僮鞣惖乃饕梢杂糜贑區(qū)域里面的模式匹配查詢。
下面的查詢顯示所有已定義的操作符類:
SELECT am.amname AS index_method, opc.opcname AS opclass_name FROM pg_am am, pg_opclass opc WHERE opc.opcmethod = am.oid ORDER BY index_method, opclass_name;
一個(gè)操作符類實(shí)際上是一個(gè)稱為 operator family的更大結(jié)構(gòu)的子集。當(dāng)幾個(gè)數(shù)據(jù)類型的作用類似時(shí),可以定義cross-data-type類型操作符并且與索引一起使用。 要做到這一點(diǎn),每個(gè)類型的操作符類必須分成相同的操作符組。cross-type型的操作符是組成員,但不與組內(nèi)的任何單個(gè)類連接。
這個(gè)查詢顯示所有已定義的操作符組和所有包含在每個(gè)組中的所有操作符:
SELECT am.amname AS index_method, opf.opfname AS opfamily_name, amop.amopopr::regoperator AS opfamily_operator FROM pg_am am, pg_opfamily opf, pg_amop amop WHERE opf.opfmethod = am.oid AND amop.amopfamily = opf.oid ORDER BY index_method, opfamily_name, opfamily_operator;