↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 6.5 已于 2004 年 6 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

CLUSTER

CLUSTER — 向后端给出存储聚簇建议

大纲

CLUSTER indexname ON table
  

输入

indexname

一个索引的名称。

table

一个表的名称。

输出

CLUSTER

聚簇已成功完成。

ERROR: relation <tablerelation_number> inherits "invoice"
ERROR: Relation x does not exist!

描述

CLUSTER指示 Postgres近似地基于 indexname所指定的索引,对 classname 所指定的类进行聚簇。该索引必须已经定义在 classname上。

当一个类被聚簇时,它会基于索引信息被物理地重新排序。聚簇是静态的。换句话说,随着类被更新,这些更改不会被聚簇。系统不会尝试让新实例或更新过的元组保持聚簇。如果需要,可以通过再次发出该命令来手动重新聚簇。

注意

表实际上被按索引顺序复制到一个临时表中,然后改回原来的名称。因此,执行聚簇时会丢失所有 GRANT 权限和其他索引。

如果你在表中随机访问单个行,数据在堆表中的实际顺序并不重要。但如果你倾向于比其他数据更常访问某些数据,并且有一个索引把它们聚集在一起,使用CLUSTER会带来好处。

CLUSTER有帮助的另一个场合是使用索引从一个表中取出多行时。如果你从一个表中请求某个索引值范围,或者一个有多行匹配的单个索引值,CLUSTER会有帮助,因为一旦索引识别出第一行匹配所在的堆页,所有其他匹配的行很可能已经在同一个堆页上,这样就节省了磁盘访问并加快了查询。

有两种聚簇数据的方法。第一种是使用 CLUSTER命令,它使用你指定的索引的顺序对原表重新排序。在大表上这可能很慢,因为行是按索引顺序从堆中取出的,如果堆表是无序的,各项就散布在随机页面上,因此每移动一行就要检索一个磁盘页。Postgres有缓存, 但大表的大部分放不进缓存。

另一种聚簇数据的方法是使用

SELECT ... INTO TABLE temp FROM ... ORDER BY ...
    

这在 ORDER BY 中使用 Postgres的排序代码来匹配索引,对于 无序数据它要快得多。然后你删除旧表,使用 ALTER TABLE/RENAME把 temp改名为旧名称,并重建任何索引。唯一的问题是 OID 不会被保留。此后,CLUSTER应该会很快,因为堆数据大部分已经有序,并且使用的是现有的索引。

用法

基于其 salary 属性聚簇 employees 关系

CLUSTER emp_ind ON emp;
  

兼容性

SQL92

SQL92 中没有CLUSTER语句。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。