?
本文檔使用
php中文網(wǎng)手冊 發(fā)布
定義索引的同時可以為索引的每個字段聲明一個操作符類operator class。
CREATE INDEX name ON table (column opclass [sort options] [, ...]);
這個操作符類指明該索引用于該字段時要使用的操作符。 例如,一個在int4上的B-tree索引將使用int4_ops類;這個操作符類包括用于int4的比較函數(shù)。 實際上,字段類型的缺省操作符通常就足夠了。擁有操作符類的主要原因是:對于某些數(shù)據(jù)類型,可能存在多個有意義的索引行為。 例如,我們可能想排序兩個復數(shù),既可能通過絕對值,也可能通過實部。我們可以通過為該數(shù)據(jù)類型定義兩個操作符類,然后在建立索引時選擇合適的那個。 操作符類決定基本的排序順序(通過添加排序選項ASC/DESC和(或者) NULLS FIRST/NULLS LAST然后進行修改)
除了缺省的以外,還有一些有內(nèi)置的操作符類:
text_pattern_ops,varchar_pattern_ops, 和bpchar_pattern_ops操作符類分別支持在text, varchar,和char類型上的B-tree索引。 他們與缺省操作符類的區(qū)別在于數(shù)值是嚴格地逐個字節(jié)比較的,而不是根據(jù)區(qū)域相關(guān)的集合規(guī)則進行比較。 這樣,如果數(shù)據(jù)庫不使用標準的"C"區(qū)域設(shè)置, 那么這些操作符類適用于那些涉及模式匹配表達式(LIKE或者POSIX正則表達式)的查詢。 舉一個例子,你可以像下面這樣對一個varchar字段進行索引:
CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
請注意,相比較使用索引而言,如果你希望包含普通<,<=, >, 或>=, 那么你還應該創(chuàng)建一個使用缺省操作符類的索引。這樣的查詢不能使用xxx_pattern_ops操作符類。 (然而,普通等價的比較,可以使用這些 操作符類。)允許在同一個字段上創(chuàng)建多個使用不同操作符類的索引。 如果你確實使用了標準的"C"區(qū)域設(shè)置,那么你就不需要xxx_pattern_ops操作符類, 因為使用缺省操作符類的索引可以用于C區(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;
一個操作符類實際上是一個稱為 operator family的更大結(jié)構(gòu)的子集。當幾個數(shù)據(jù)類型的作用類似時,可以定義cross-data-type類型操作符并且與索引一起使用。 要做到這一點,每個類型的操作符類必須分成相同的操作符組。cross-type型的操作符是組成員,但不與組內(nèi)的任何單個類連接。
這個查詢顯示所有已定義的操作符組和所有包含在每個組中的所有操作符:
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;