CREATE INDEX(7) SQL Commands CREATE INDEX(7)

CREATE INDEX - 定義一個新索引

CREATE [ UNIQUE ] INDEX name ON table [ USING method ]
    ( { column | ( expression ) } [ opclass ] [, ...] )
    [ 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 子句,則建立一個部分索引。 部分索引是一個只包含表的一部分記錄的索引,通常是該表中最讓人感興趣的部分。 比如,如果你有一個表,裡面包含已上賬和未上賬的定單, 未上賬的定單隻佔表的一小部分而且這部分是最常用的部分, 那麼你就可以透過只在這個部分建立一個索引來改善效能。 另外一個可能的用途是用 WHERE 和 UNIQUE 強制一個表的某個子集的唯一性。


在 WHERE 子句裡用的表示式只能引用下層表的欄位(但是它可以使用所有欄位,而不僅僅是被索引的欄位)。 目前,子查詢和聚集表示式也不能出現在WHERE裡。


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


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

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

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

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

表的列/欄位名。

一個基於該表的一個或多個欄位的表示式。 這個表示式通常必須帶著圓括弧包圍寫出,如語法中顯示那樣。 不過,如果表示式有函式呼叫的形式,那麼圓括弧可以省略。

一個關聯的運算子表。參閱下文獲取細節。

為一個部分索引定義約束表示式。


參閱 ``Indexes'' 獲取有關何時使用索引,何時不使用索引, 以及哪種情況下是有用的資訊。


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


可以為索引的每個列/欄位宣告一個 運算子表。 運算子表標識將要被該索引用於該列/欄位的運算子。 例如, 一個四位元組整數的 B-tree 索引將使用 int4_ops 表; 這個運算子表包括四位元組整數的比較函式。 實際上,該域的資料型別的預設運算子表一般就足夠了。 某些資料型別有運算子表的原因是,它們可能有多於一個的有意義的順序。 例如,我們對複數型別排序時有可能以絕對值或者以實部。 我們可以透過為該資料型別定義兩個運算子表,然後在建立索引的時候選擇合適的表來實現。 有關運算子表更多的資訊在 ``Operator Classes'' 和 ``Interfacing Extensions to Indexes'' 裡。


使用 DROP INDEX [drop_index(7)] 刪除一個索引。


在表films上的 title欄位建立一個 B-tree 索引:

CREATE UNIQUE INDEX title_idx ON films (title);

CREATE INDEX 是 PostgreSQL 語言擴充套件。 在 SQL 標準中沒有 CREATE INDEX 命令。

譯者

Postgresql 中文網站 何偉平 <laser@pgsqldb.org>

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

2003-11-02 SQL - Language Statements