ORACLE創建索引

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 子句,則創建一個部分索引。 部分索引是一個只包含表的一部分記錄的索引,通常是該表中比其它部分數據更有用的部分。 比如,如果你有一個表,裏面包含已上賬和未上賬的定單, 未上賬的定單隻佔表的一小部分而且這部分是最常用的部分, 那麼你就可以通過只在這個部分創建一個索引來改善性能。 另外一個可能的用途是用 WHERE 和 UNIQUE 強制一個表的某個子集的唯一性。 參閱 Section 11.7 探討更多信息。

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

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

參數

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

name
要創建的索引名。這裏不能包含模式名; 索引總是在同一個模式中作爲其父表創建的。

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

method
用於索引的方法的名字。可選的名字是 btree, hash,rtree,和 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.8 和 Section 32.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;


ALTER INDEX
Name
ALTER INDEX -- 改變一個索引的定義
Synopsis
ALTER INDEX name RENAME TO new_name
ALTER INDEX name SET TABLESPACE tablespace_name描述
ALTER INDEX 改變一個現有索引的定義。 它有幾種子形式:


RENAME
RENAME 形式改變索引的名字。對存儲的數據沒有影響。

SET TABLESPACE
這種形式改變索引的表空間爲指定表空間,並且把索引相關的數據文件移動到新的表空間裏。 又見 CREATE TABLESPACE。


參數

name
要修改的索引的名字(可以有模式修飾)。

new_name
索引的新名字。

new_owner
索引的新所有者的用戶名。

tablespace_name
索引將移動到的表空間的名字。

注意
這些操作也可以用 ALTER TABLE 進行。 ALTER INDEX 實際上只是 ALTER TABLE 應用於索引的形式的一個別名。

以前還有一個 ALTER INDEX OWNER 變種, 但是現在忽略了(帶一個警告)。一個索引不能有一個和其表的主人不同的所有者。 改變該表的所有者自動改變索引的所有者。

修改任何系統表索引的部分都是不允許的。

例子
重命名一個現有的索引:

ALTER INDEX distributors RENAME TO suppliers;
把一個索引移動到另外一個表空間:

ALTER INDEX distributors SET TABLESPACE fasttablespace;
發佈了90 篇原創文章 · 獲贊 0 · 訪問量 2341
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章