On this page
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 TABLE的CLUSTER
或SET 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 版本兼容。