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

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 8.1 已于 2010 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

CLUSTER

CLUSTER — 按照一个索引对表进行聚簇

大纲

CLUSTER indexname ON tablename
CLUSTER tablename
CLUSTER

描述

CLUSTER 指示 PostgreSQL 按照 indexname 指定的索引,对 tablename 指定的表进行聚簇。该索引必须已经定义在 tablename 上。

当一个表被聚簇时,它会根据索引信息在物理上重新排序。聚簇是一次性 操作:之后如果表再被更新,这些更改不会再次被聚簇。也就是说,系 统不会试图按照索引顺序存储新行或更新后的行。如果需要,可以定期 再次执行该命令来重新聚簇。

当一个表被聚簇时,PostgreSQL 会记住该表是按哪个索引聚簇的。形式 CLUSTER tablename 会使用与之前相同的索引对表重新聚簇。

不带任何参数的 CLUSTER 会对当前数据库中属于调用用户的所有表重新执行聚簇;如果由超级用户调用,则会对所有表重新执行聚簇。(从未聚簇过的表不包括在内。) 这种形式的 CLUSTER 不能在事务或函数内调用。

当对一个表执行聚簇时,会在该表上获取 ACCESS EXCLUSIVE 锁。这会阻止任何其他数据库操作(包括读和写) 在 CLUSTER 完成前访问该表。

参数

indexname

索引的名称。

tablename

表的名称(可能是模式限定的)。

注解

CLUSTER会丢失元组的全部可见性信息,这使得在CLUSTER命令完成之前获取的任何快照看来,该表都是空的。这使得CLUSTER不适合在访问被聚簇表的事务与CLUSTER并发运行的应用中使用。这一点在可串行化事务中最为明显,因为它们在事务开始时只取一个快照,但读已提交事务也会受到影响。

当你在表中随机访问单行时,数据在表中的实际顺序并不重要。但是,如果访问某些数据比其他数据更频繁,并且存在将这些数据放在一起的索引,使用CLUSTER就会有益。如果要从表中获取一段索引值范围,或者获取有多行匹配的单个索引值,CLUSTER会有帮助,因为一旦索引确定第一个匹配行所在的表页,其他匹配行很可能已在同一个堆页面中,从而减少磁盘访问并加快查询。

使用索引扫描时,会创建一个表的临时副本,其中表数据按索引顺序排列。还会为表上的每个索引创建临时副本。因此,所需的磁盘空闲空间至少应等于表大小与索引大小之和。

由于CLUSTER会记住聚簇信息,你可以第一次手工聚簇想要聚簇的表,然后设置一个类似于VACUUM的定时事件,让这些表被周期性地重新聚簇。

因为规划器会记录有关表中数据顺序的统计信息,建议在新近聚簇过的表上 运行ANALYZE。 否则,规划器可能会选择很差的查询计划。

还有另一种聚簇数据的方法。CLUSTER命令通过使用你指定的索引扫描原始表来对它重新排序。这对于大型表可能很慢,因为行是按索引顺序从堆中取得的,而如果堆表是无序的,条目就散布在随机页面中,因此每移动一行都要检索一个磁盘页。(PostgreSQL有缓存,但一个大表的绝大部分放不进缓存。)另一种聚簇表的方法是使用:

CREATE TABLE newtable AS
    SELECT columnlist FROM table ORDER BY columnlist;

它使用ORDER BY子句中PostgreSQL的排序代码产生想要的顺序;对于无序数据,这通常比索引扫描快得多。然后你删除旧表,使用ALTER TABLE ... RENAME把newtable改名为旧表的名字,并重建该表的索引。不过,这种方法不保留 OID、约束、外键关系、被授予的权限以及表的其他附属属性—所有这些项都必须手工重建。

示例

按照索引 emp_ind 对表 emp 进行聚簇:

CLUSTER emp_ind ON emp;

使用之前用过的同一个索引对 emp 表进行聚簇:

CLUSTER emp;

对数据库中已聚簇过的所有表执行聚簇:

CLUSTER;

兼容性

SQL 标准中没有 CLUSTER 语句。

另见

clusterdb

提交更正

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