关于 YMatrix
标准集群部署
数据写入
数据迁移
数据查询
运维监控
参考指南
工具指南
数据类型
存储引擎
执行引擎
流计算引擎
灾难恢复
系统配置参数
索引
扩展
SQL 参考
常见问题(FAQ)
根据索引在磁盘上对表进行物理重新排序。
CLUSTER <indexname> ON <table_name>
CLUSTER [VERBOSE] <table_name> [ USING <index_name> ]
CLUSTER [VERBOSE]
CLUSTER 命令指示数据库根据 <index_name> 指定的索引对 <table_name> 进行排序。该索引必须已在 <table_name> 上预先定义。
当表被聚簇化后,其物理存储结构将根据索引信息在磁盘上重新排序。聚簇化是一次性操作:后续对表的更新不会触发聚簇化。即系统不会尝试按索引顺序存储新增或更新的行。若需保持索引排序,可定期重新执行该命令。将表的 FILLFACTOR 存储参数设置为低于 100% 可在更新时保留聚簇排序,因为当页面有足够空间时,更新后的行将保留在原页面。
使用此命令对表进行聚簇时,数据库会记录所使用的索引。命令形式 CLUSTER <table_name> 将使用先前相同的索引对表重新聚簇。可通过 ALTER TABLE 的 CLUSTER 或 SET WITHOUT CLUSTER 形式设置未来聚簇操作的索引,或清除先前设置。若未指定参数,CLUSTER将重新聚簇当前数据库中调用用户拥有的所有已聚簇表;若由超级用户调用,则重新聚簇所有表。此形式的 CLUSTER 无法在事务块内执行。
执行聚簇操作时,系统将获取表的排他访问锁。这将阻止任何其他数据库操作(包括读写)在聚簇完成前对该表进行操作。
如果所需记录在磁盘上随机分布,则数据库必须遍历整个磁盘才能获取请求的记录。若这些记录存储位置更接近,则从磁盘读取的过程更具顺序性。当您在表内随机访问单行数据时,表中数据的实际顺序并不重要。但若某些数据被频繁访问且存在将它们聚合的索引,使用 CLUSTER 将带来显著效益。当查询表中索引值的范围,或查询单个索引值对应的多条匹配记录时,CLUSTER 模式能显著提升效率:索引定位到首条匹配记录的表页后,其余匹配记录很可能已存在于同一表页,从而减少磁盘访问次数并加速查询。日期列按时间顺序排列的数据即为聚簇索引的典型应用场景。针对特定日期范围的查询将实现有序磁盘读取,从而利用更快的顺序访问特性。
CLUSTER 操作可通过两种方式重新排序表:使用指定索引的索引扫描,或(若索引为 B 树)先进行顺序扫描再排序。系统将根据规划器成本参数和可用统计信息,尝试选择更快的排序方法。
采用索引扫描时,会创建包含按索引顺序排列的表数据的临时副本。同时会创建表上每个索引的临时副本。因此磁盘需预留至少等于表大小与索引大小总和的可用空间。
采用顺序扫描加排序时,还会创建临时排序文件,导致峰值临时空间需求可能达到表大小的两倍加上索引大小。此方法通常比索引扫描更快,但若磁盘空间需求过高,可通过将 enable_sort 配置参数临时设为 off 来禁用该选项。
建议在聚簇前将 maintenance_work_mem 配置参数设为合理大值(但不超过可分配给 CLUSTER 操作的内存总量)。
由于查询优化器会记录表排序统计信息,建议对新聚簇表执行 ANALYZE 操作。否则规划器可能生成低效的查询计划。
由于 CLUSTER 会记录已聚簇索引,您可首次手动聚簇目标表,随后设置定期维护脚本执行无参数的 CLUSTER 命令,实现目标表的周期性重新聚簇。
基于索引 emp_ind 对员工表进行聚簇:
CLUSTER emp_ind ON emp;
使用之前使用的相同索引对员工表进行聚簇:
CLUSTER employees;
对数据库中所有先前已聚簇的表进行聚簇:
CLUSTER;
SQL 标准中没有 CLUSTER 语句。