CLUSTER

CLUSTER —根据索引对表进行聚类

Synopsis

CLUSTER [VERBOSE] table_name [ USING index_name ]
CLUSTER [VERBOSE]

Description

CLUSTER指示 PostgreSQL 根据* index_name 指定的索引对 table_name 指定的表进行集群。索引必须已经在 table_name *上定义。

对表进行集群时,将根据索引信息对其进行物理重新排序。集群是一项一次性操作:表在随后进行更新时,更改不会集群。即,没有尝试根据索引的 Sequences 存储新行或更新行。 (如果愿意,可以通过再次发出命令来周期性地重新编组.而且,将表的fillfactor storage 参数设置为小于 100%可以有助于在更新期间保留集群 Sequences,因为如果有足够的空间,则更新的行将保留在同一页上在那里可用.)

当一个表被集群时,PostgreSQL 会记住该表被集群的索引。形式CLUSTER table_name使用与以前相同的索引重新整理表。您还可以使用ALTER TABLECLUSTERSET WITHOUT CLUSTER形式来设置用于将来的集群操作的索引,或清除以前的任何设置。

没有任何参数的CLUSTER会重现主叫用户拥有的当前数据库中所有先前聚集的表,或者被超级用户调用的所有此类表。 CLUSTER的这种形式不能在事务块内执行。

对表进行群集时,将在其上获得ACCESS EXCLUSIVE锁。这样可以防止对表执行任何其他数据库操作(包括读写操作),直到CLUSTER完成。

Parameters

  • table_name

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

    • 索引名称。
  • VERBOSE

    • 当每个表聚集在一起时,打印进度报告。

Notes

如果您要随机访问表中的单个行,则表中数据的实际 Sequences 并不重要。但是,如果您倾向于访问比其他数据更多的数据,并且有一个将它们分组在一起的索引,那么您将受益于CLUSTER。如果要从表中请求某个范围的索引值,或者是具有多个匹配行的单个索引值,则CLUSTER会有所帮助,因为一旦索引为匹配的第一行标识了表页面,则所有其他匹配的行都可能已经在同一表页面上,因此您可以保存磁盘访问并加快查询速度。

CLUSTER可以使用对指定索引的索引扫描或(如果索引是 b 树)(如果索引是 b 树)对表进行重新排序,然后进行排序。它将基于计划者成本参数和可用的统计信息,尝试选择更快的方法。

使用索引扫描时,将创建表的临时副本,该副本包含按索引 Sequences 排列的表数据。还将创建表上每个索引的临时副本。因此,磁盘上的可用空间至少等于表大小和索引大小的总和。

当使用 Sequences 扫描和排序时,还将创建一个临时排序文件,因此临时空间峰值需求是表大小加索引大小的两倍。此方法通常比索引扫描方法快,但是如果磁盘空间需求无法忍受,则可以通过将enable_sort临时设置为off来禁用此选择。

建议在群集之前将maintenance_work_mem设置为一个较大的值(但不要大于您可以用于CLUSTER操作的 RAM 数量)。

因为计划者记录了有关表 Sequences 的统计信息,所以建议在新的群集表上运行ANALYZE。否则,计划者可能会选择错误的查询计划。

由于CLUSTER记住要聚集的索引,因此可以将要手动聚集的表聚集在一起,然后设置一个定期维护脚本,该脚本无需任何参数即可执行CLUSTER,以便定期重新聚集所需的表。

Examples

根据表employees的索引对表employees进行集群:

CLUSTER employees USING employees_ind;

使用之前使用的相同索引对employees表进行集群:

CLUSTER employees;

群集数据库中以前已群集的所有表:

CLUSTER;

Compatibility

SQL 标准中没有CLUSTER语句。

The syntax

CLUSTER index_name ON table_name

还支持与 8.3 之前的 PostgreSQL 版本兼容。

See Also

clusterdb