CREATE INDEX

Name

CREATE INDEX -- 定義一個新索引

Synopsis

CREATE [ UNIQUE ] INDEX name ON table [ USING method ]
    ( { column | ( expression ) } [ opclass ] [, ...] )
    [ TABLESPACE tablespace ]
    [ WHERE predicate ]

描述

CREATE INDEX 在指定的資料表上構造一個名為 index_name 的索引。索引主要用來提高資料庫性能。但是如果不恰當的使用將導致性能的下降。

索引的鍵字字串是以字串名的方式聲明的,或者是可選的寫在一個圓括弧裡面的資料表達式。 如果索引方式支援多個字串索引,那麼我們也可以聲明多個字串。

一個索引字串可以是一個使用資料表的行的一個或多個字串的數值進行計算的資料表達式。 整個特性可用於獲取對基本資料某種變形的快速訪問。 比如,一個在 upper(col) 上的函數索引將允許子句 WHERE upper(col) = 'JIM' 使用索引。

PostgreSQL 為從索引提供 B-tree,R-tree,hash(散列) 和 GiST 索引方法。 B-tree 索引方法是一個 Lehman-Yao 高並發 B-trees 的實 現。R-tree 索引方法用 Guttman 的二次分裂算法實現了標準的 R-trees。 hash(散列)索引方法是 Litwin 的線性散列的一個實現。 用戶也可以定義它們自己的索引方法,但這個工作相當複雜。

如果出現了 WHERE 子句,則建立一個部分索引。 部分索引是一個只包含資料表的一部分記錄的索引,通常是該資料表中比其它部分資料更有用的部分。 比如,如果您有一個資料表,裡面包含已上賬和未上賬的定單, 未上賬的定單只佔資料表的一小部分而且這部分是最常用的部分, 那麼您就可以透過只在這個部分建立一個索引來改善性能。 另外一個可能的用途是用 WHEREUNIQUE 強制一個資料表的某個子集的唯一性。 參閱 Section 11.7 探討更多訊息。

WHERE 子句裡用的資料表達式只能引用下層資料表的字串,但是它可以使用所有字串,而不僅僅是被索引的字串。 目前,子查詢和聚集資料表達式也不能出現在WHERE裡。

索引定義裡的所有函數和操作符都必須是immutable,(不變的)也就是說, 它們的結果必須只能依賴於它們的輸入參數,而決不能依賴任何外部的影響(比如另外一個資料表的內容或者目前時間)。 這個約束確保該索引的行為是定義完整的。要在一個索引上使用用戶定義函數,請記住在您建立它的時候把它標記為immutable的函數。

參數

UNIQUE

令系統檢測當索引建立時(如果資料已經存在)和每次添加資料時資料表中是否有重複值。 如果插入或更新的值會導致重複的記錄時將生成一個錯誤。

name

要建立的索引名。這裡不能包含模式名; 索引總是在同一個模式中作為其父資料表建立的。

table

要索引的資料表名(可能有模式修飾)。

method

用於索引的方法的名字。可選的名字是 btreehashrtree,和 gist。預設方法是 btree

column

資料表的列/字串名。

expression

一個基於該資料表的一個或多個字串的資料表達式。 這個資料表達式通常必須帶著圓括弧包圍寫出,如語法中顯示那樣。 不過,如果資料表達式有函數調用的形式,那麼圓括弧可以省略。

opclass

一個關聯的操作符資料表。參閱下文獲取細節。

tablespace

建立索引所在的資料表空間。如果沒有聲明,則使用 default_tablespace 的資料表空間, 如果 default_tablespace 是空字串,則使用資料庫的預設資料表空間。

predicate

為一個部分索引定義約束資料表達式。

注意

參閱 Chapter 11 獲取有關何時使用索引,何時不使用索引, 以及它們哪種情況下是有用的訊息。

目前,只有 B-tree 和 gist 索引方法支援多字串索引。 預設時最多可以聲明 32 個鍵字(這個限制可以在製作 PostgreSQL 時修改)。 目前只有 B-tree 支援唯一索引。

可以為索引的每個列/字串聲明一個 操作符資料表。 操作符資料表標識將要被該索引用於該列/字串的操作符。 例如, 一個四字元整數的 B-tree 索引將使用 int4_ops 資料表; 這個操作符資料表包括四字元整數的比較函數。 實際上,該域的資料類型的預設操作符資料表一般就足夠了。 某些資料類型有操作符資料表的原因是,它們可能有多於一個的有意義的順序。 例如,我們對複數類型排序時有可能以絕對值或者以實部。 我們可以透過為該資料類型定義兩個操作符資料表,然後在建立索引的時候選擇合適的資料表來實現。 有關操作符資料表更多的訊息在 Section 11.6Section 31.14 裡。

使用 DROP INDEX 刪除一個索引。

預設時索引不會用於 IS NULL 子句。這種場合下使用索引的最好方法是用 IS NULL 謂詞建立一個部分索引。

例子

在資料表films上的 title字串建立一個 B-tree 索引:

CREATE UNIQUE INDEX title_idx ON films (title);

在資料表 films 的字串 code 上建立一個索引, 並且讓索引存在於資料表空間 indexspace上:

CREATE INDEX code_idx ON films(code) TABLESPACE indexspace;

相容性

CREATE INDEX 是 PostgreSQL 語言擴展。 在 SQL92 中沒有 CREATE INDEX 命令。

又見

ALTER INDEX, DROP INDEX