Skip to content

CLUSTER

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

语法

CLUSTER [VERBOSE] table_name [ USING index_name ]
CLUSTER ( option [, ...] ) table_name [ USING index_name ]
CLUSTER [VERBOSE]

where option can be one of:

    VERBOSE [ boolean ]

描述

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

对表进行聚类时,会根据索引信息对其进行物理重新排序。聚类是一次性操作:在随后更新表时,不会对更改进行聚类。也就是说,不会尝试根据索引顺序存储新行或更新行。(如果需要,可以通过再次发出命令来定期重新聚类。此外,将表的fillfactor存储参数设置为低于 100% 有助于在更新期间保留聚类顺序,因为如果那里有足够的空间,则更新的行将保留在同一页上。)

对表进行聚类时,PostgreSQL会记住对其进行聚类的索引。形式CLUSTER*table_name*使用与之前相同的索引对表进行重新聚类。您还可以使用ALTER TABLECLUSTERSET WITHOUT CLUSTER形式来设置用于未来聚类操作的索引,或清除任何以前的设置。

如果没有*table_name*的CLUSTER,则会重新聚类当前数据库中调用用户拥有的所有先前聚类的表,或者如果超级用户调用,则会重新聚类所有此类表。这种形式的CLUSTER不能在事务块内执行。

对表进行聚类时,会获取其上的ACCESS EXCLUSIVE锁。这会阻止任何其他数据库操作(包括读取和写入)在CLUSTER完成之前对表进行操作。

参数

table_name

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

index_name

索引的名称。

VERBOSE

在对每个表进行聚类时打印进度报告。

boolean

指定是否应打开或关闭所选选项。您可以编写 TRUEON1 以启用该选项,以及 FALSEOFF0 以禁用该选项。boolean 值也可以省略,在这种情况下,假定为 TRUE

注释

在您在表内随机访问单行的情况下,表中数据的实际顺序并不重要。但是,如果您倾向于比其他数据更频繁地访问某些数据,并且有一个将它们组合在一起的索引,那么您将受益于使用CLUSTER。如果您从表中请求一系列已编制索引的值,或具有多个匹配行的单个已编制索引的值,CLUSTER将有所帮助,因为一旦索引识别出与第一行匹配的表页,所有其他匹配的行可能已经在同一表页上,因此您可以节省磁盘访问并加快查询速度。

CLUSTER可以使用指定索引上的索引扫描或(如果索引是 b 树)顺序扫描后跟排序来重新对表进行排序。它将尝试根据计划程序成本参数和可用的统计信息选择更快的那个方法。

当使用索引扫描时,将创建表的临时副本,其中包含按索引顺序排列的表数据。还将创建表上每个索引的临时副本。因此,您需要至少等于表大小和索引大小之和的磁盘上的可用空间。

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

建议在进行群集之前将maintenance_work_mem设置为一个相当大的值(但不要超过您可以专门用于CLUSTER操作的 RAM 量)。

由于计划程序记录了有关表排序的统计信息,因此建议对新群集表运行ANALYZE。否则,计划程序可能会对查询计划做出错误的选择。

由于CLUSTER会记住哪些索引已聚集,因此可以手动首次聚集想要聚集的表,然后设置定期维护脚本,执行不带任何参数的CLUSTER,以便定期重新聚集所需的表。

每个运行CLUSTER的后端都会在pg_stat_progress_cluster视图中报告其进度。有关详细信息,请参阅第 28.4.2 节

聚集分区表会使用指定分区索引的分区聚集其每个分区。聚集分区表时,不能省略索引。不能在事务块内对分区表执行CLUSTER

示例

根据其索引employees_ind聚集表employees

CLUSTER employees USING employees_ind;

使用之前使用的相同索引聚集employees

CLUSTER employees;

聚集数据库中之前已聚集的所有表

CLUSTER;

兼容性

SQL 标准中没有CLUSTER语句。

语法

CLUSTER index_name ON table_name

还受支持,以兼容 8.3 之前的PostgreSQL版本。

另请参阅

clusterdb第 28.4.2 节