PostgreSQL
上一頁   下一頁

CREATE INDEX

名稱

CREATE INDEX ─ 構建一個從索引

CREATE [ UNIQUE ] INDEX index_name ON table
    [ USING acc_name ] ( column [ ops_name] [, ...] )
CREATE [ UNIQUE ] INDEX index_name ON table
    [ USING acc_name ] ( func_name( column [, ... ]) ops_name )
  

輸入

UNIQUE
令系統檢測當索引創建時(如果數據已經存在)和每次添加數據時表中是否有重複值。插入或更新(非)重複值(?non-duplicate data,譯注:不會吧,好像原文錯了。)時將導致一個錯誤。
index_name
要創建的索引名。
table
要索引的表名。
acc_name
用於索引的訪問模式。預設訪問模式是 BTREE。Postgres 提供三種用於從索引的訪問模式:
BTREE
一個 Lehman-Yao 高度並發 btrees 的實現。
RTREE
用 Guttman 二分法做的標準 rtrees 的實現。
HASH
一個Litwin 線性哈希(散列)法的實現。
column
表的列/字段名。
ops_name
一個關聯的運算符號表。參閱下文獲取細節。
func_name
用戶定義的函數,其返回值可被索引。

輸出

CREATE
索引成功創建的返回資訊。
ERROR: Cannot create index: 'index_name' already exists.
如果不能創建索引,返回此資訊。

描述

CREATE INDEX 在指定的表 table 上構建一個名為 index_name 的索引。

小技巧: 索引主要用來提高資料庫性能。但是如果不恰當的使用將導致性能的下降。

在上面第一個語法裡,索引的鍵字以列/字段名聲明﹔一個列/字段也可以與一個運算符號表相聯。一個運算符號表用以說明某索引將要用到的運算符號。例如, 一個4-字節整數的 btree 索引將使用int4_ops 表﹔這個運算符號表包括4-字節整數的比較函數。預設的運算符號表是該域型態的匹配運算符號表。

在第二種語法中,索引是以用戶定義的函數 func_name 的結果定義的,該函數應用於一個表的一個或多個字段。這些函數索引可用於獲取更快的數據訪問速度,尤其在這些數據的操作是基於一些需要做一定轉換才能用於基本數據的運算符號時。

Postgres 為從索引提供 btree,rtree 和 hash(散列)訪問模式。btree 訪問模式是一個 Lehman-Yao 高並發 btrees 的實現。rtree 訪問模式用 Guttman 的二分算法實現了標準的 rtrees。hash(散列)訪問模式是 Litwin 的線性散列的一個實現。我們單獨的列出這些所用的算法是要表明所有這些訪問模式都是完全動態的並且不必進行周期性的最佳化(例如,像靜態散列算法常見的那樣)。

注意

當一個索引了的字段涉及到使用: <,<=,=,>=,> 之一進行比較時,Postgres 的查詢最佳化器將考慮在掃描中使用 btree 索引。

Postgres 裡兩種 box (方形)表都支援對 box 數據型態的索引。兩者的區別是 bigbox_ops 把方形的坐標按比例縮小,以避免在對非常大的浮點數坐標做乘法,加法和減法時出現浮點例外。如果你的方形所在的範圍的大小是 20,000 單位的平面或更大,你應該用 bigbox_opspoly_ops 運算符號表支援 polygon 型態數據的 rtree 索引。

當一個索引了的字段涉及到使用: <<,&<,&>,>>,@,~=,&& 之一進行比較時,Postgres 的查詢最佳化器將考慮在掃描中使用 rtree 索引。

當一個索引了的字段涉及到使用 = 進行比較時,Postgres 的查詢最佳化器將考慮在掃描中使用散列(hash)索引。

目前,只有 BTREE 訪問模式支援多字段索引。最多可以聲明 7 的關鍵字。

使用 DROP INDEX 刪除一個索引。

int24_ops 運算符號表在為 int2 型態的數據構建索引並且與查詢資格條件裡的 int4 數據做比較時很有用。類似的,int42_ops 支援對要和查詢裡的 int2 數據做比較的 int4 數據進行索引。

下面的選擇列表返回所有 ops_names:

SELECT am.amname AS acc_name,
       opc.opcname AS ops_name,
       opr.oprname AS ops_comp
    FROM pg_am am, pg_amop amop,
         pg_opclass opc, pg_operator opr
    WHERE amop.amopid = am.oid AND
          amop.amopclaid = opc.oid AND
          amop.amopopr = opr.oid
    ORDER BY acc_name, ops_name, ops_comp
    

用法

在表 films 上的 title 字段創建一個 btree 索引:

CREATE UNIQUE INDEX title_idx
    ON films (title);
  

兼容性

SQL92

CREATE INDEX 是 Postgres 語言擴展。

在 SQL92 中沒有 CREATE INDEX 命令。


上一頁 首頁 下一頁
CREATE GROUP 開頭 CREATE LANGUAGE