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