|
CREATE INDEXSynopsisCREATE [ UNIQUE ] INDEX index_name ON table [ USING acc_method ] ( column [ ops_name ] [, ...] ) [ WHERE predicate ] CREATE [ UNIQUE ] INDEX index_name ON table [ USING acc_method ] ( func_name ( column [, ... ]) [ ops_name ] ) [ WHERE predicate ] 输入
描述CREATE INDEX 在指定的表 table 上构造一个名为 index_name 的索引.
在上面第一个语法里,索引的键字以列/字段名声明. 如果索引的访问模式支持多列索引,我们也可以声明多个字段. 在上面显示的第二种语法中,索引是以用户定义的函数 func_name 的结果定义的, 该函数应用于一个表的一个或多个字段. 这些 函数索引(functional indices) 可用于获取更快的数据访问速度, 尤其在这些数据的操作是基于一些需要做一定转换才能应用基本数据的操作符时. 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 里. 索引定义里的所有函数和操作符都必须是 cachable , 也就是说,它们的结果必须只能依赖于它们的输入参数,而决不能 依赖任何外部的影响(比如另外一个表的内容或者当前时间). 这个约束确保该索引的行为是定义完整的.要在一个索引上使用 用户定义函数,请记住在你创建它的时候把它标记未可缓冲的函数. 使用 DROP INDEX 删除一个索引. 注意当一个索引了的字段涉及到使用: <, <=, =, >=, > 之一进行比较时, PostgreSQL 的查询优化器将考虑在扫描中使用B-tree 索引。 当一个索引了的字段涉及到使用: <<, &<, &>, >>, @, ~=, && 之一进行比较时, PostgreSQL 的查询优化器将考虑在扫描中使用 R-tree 索引。 当一个索引了的字段涉及到使用 = 操作符 进行比较时, PostgreSQL 的查询优化器将考虑在扫描中使用散列(hash)索引。 目前,只有 B-tree 和 gist 访问模式支持多字段索引。 缺省时最多可以声明 16 个键字(这个限制可以在制作 PostgreSQL 时修改). 目前只有 B-tree 支持唯一索引. 可以为索引的每个列/字段声明一个 操作符表 . 操作符表标识将要被该索引用于该列/字段的操作符. 例如, 一个4-字节整数的 B-tree 索引将使用 int4_ops 表; 这个操作符表包括4-字节整数的比较函数. 实际上,该域的数据类型的缺省操作符表一般就足够了. 某些数据类型有操作符表的原因是,它们可能有多于一个的有意义的顺序. 例如,我们对复数类型排序时有可能以绝对值或者以实数部分. 我们可以通过为该数据类型定义两个操作符表,然后在建立索引的时候选择 合适的表来实现.还有些操作符表有特殊的用途:
下面的查询显示所有已定义的操作符表: SELECT am.amname AS acc_method, opc.opcname AS ops_name, opr.oprname AS ops_comp FROM pg_am am, pg_opclass opc, pg_amop amop, pg_operator opr WHERE opc.opcamid = am.oid AND amop.amopclaid = opc.oid AND amop.amopopr = opr.oid ORDER BY acc_method, ops_name, ops_comp
|