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

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

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、约束、外键关系、已授予的权限以及表的其他附属属性——所有这些项都必须手动重建。

示例

基于表 employees 的索引 emp_ind 对该表进行聚簇:

CLUSTER emp_ind ON emp;

使用与之前相同的索引聚簇 employees 关系:

CLUSTER emp;

聚簇数据库中所有之前被聚簇过的表:

CLUSTER;

兼容性

SQL 标准中没有CLUSTER语句。

另见

clusterdb

提交更正

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