CLUSTER

Name

CLUSTER — 向服务器给出存储建簇的建议
CLUSTER indexname ON tablename
  

输入

indexname

一个索引名称.

table

准备建簇的表的名称.

输出

CLUSTER

成功建簇.

ERROR: relation <tablerelation_number> inherits "table"

ERROR: Relation table does not exist!

描述

CLUSTER 指示Postgres 近似地基于索引 indexname 的度量对表 table 进行存储建簇. 索引必须已经在表 tablename. 上定义了.

当对一个表建簇后,该表的物理存储将基于索引信息进行. 建簇是静态的,也就是说,当表被更新后,改变的内容不会建簇. 不会试图对更新过的记录重新建簇. 如果需要,可以通过手工执行该命令的方法重建簇.

注意

该表实际上按索引顺序拷贝到了一个临时表中,然后重新改成原名. 因此,在建簇时所有赋予的权限和其它索引都将丢失.

如果你只是随机的访问表中的行, 那么在堆表中的数据的实际存储顺序是无关紧要的. 但是,如果你对某些数据的访问多于其他数据, 而且有一个索引将这些数据分组,那你就将从 使用 CLUSTER 中获益.

另一个CLUSTER 很有帮助的例子是当你用索引从一个表中取出几个记录时. 如果你从一个表中请求一定索引范围的值, 或者是一个索引过的值对应多行, CLUSTER 也会有助于应用, 因为如果索引标识出第一匹配行所在的堆存储页,所有 其他行也可能已经在同一堆存储页里了, 这样便节省了磁盘访问的时间,加速了查询.

有两种建簇的数据.第一种是用 CLUSTER 命令,此命令将原表按你声明的索引重新排列. 这个动作在操作大表时可能会很慢, 因为每一行都从堆存储页里按索引顺序取出,如果存储页表没有排序, 整个表是随机存放在各个页面的,因而每行都要进行依次磁盘页面操作. Postgres 有一个缓冲, 但一个大表的主体是不可能都放到缓冲去的.

另一个对数据建簇的方法是使用

SELECT columnlist INTO TABLE newtable
     FROM table ORDER BY columnlist
    
这个用法使用Postgres 排序的代码 ORDER BY 来匹配索引,在对未排序的数据操作时速度快得多. 然后你可以删除旧表,用 ALTER TABLE/RENAMEtemp 改成旧表名, 并且重建所有索引.唯一的问题是 OID 将不保留.这时再做 CLUSTER 将快得多, 因为大多数堆栈数据已经排过序了而且使用现有的索引.

用法

以雇员的薪水属性对雇员关系建簇.

CLUSTER emp_ind ON emp;
  

兼容性

SQL92

在 SQL92 规范里没有 CLUSTER 语句.