CLUSTER

    CLUSTER指定openGauss通过索引名指定的索引聚簇由表名指定的表。 表名上必须已经定义该索引。

    当对一个表聚集后,该表将基于索引信息进行物理存储。聚集是一次性操作:当表被更新之后, 更改的内容不会被聚集。也就是说,系统不会试图按照索引顺序对新的存储内容及更新记录进行重新聚集。

    在对一个表聚簇之后,openGauss会记录在哪个索引上建立了聚集。 CLUSTER table_name的聚集形式在之前的同一个索引的表上重新聚集。用户也可以用ALTER TABLE的CLUSTER或SET WITHOUT CLUSTER形式来设置索引来用于后续的聚集操作或清除任何之前的设置。

    不含参数的CLUSTER会将当前用户所拥有的数据库中的先前做过聚簇的所有表重新处理,或者系统管理员调用的这些表。

    在对一个表进行聚簇的时候,会在其上请求一个ACCESS EXCLUSIVE锁。这样就避免了在CLUSTER完成之前对此表执行其它的操作(包括读写)。

    注意事项

    • 只有行存B-tree索引支持CLUSTER操作。
    • 在聚簇过程中,系统先创建一个按照索引顺序建立的表的临时拷贝。同时也建立表上的每个索引的临时拷贝。因此,需要磁盘上有足够的剩余空间, 至少是表大小和索引大小的和。
    • 因为CLUSTER记忆聚集信息,可以在第一次的时候手工对表进行聚簇,然后设置一个类似VACUUM的时间,这样就可以周期地自动对表进行聚簇操作。
    • 因为优化器记录着有关表的排序的统计,所以建议在新近聚簇的表上运行ANALYZE。否则,优化器可能会选择很差劲的查询规划。
    • CLUSTER不允许在事务中执行。
    • 如果没有打开xc_maintenance_mode参数,那么CLUSTER操作将跳过所有系统表。
    • 对一个分区进行聚簇排序。

    参数说明

    • VERBOSE

      启用显示进度信息。

    • table_name

      取值范围:已存在的表名称。

    • index_name

      索引名称。

      取值范围:已存在的索引名称。

    • partition_name

      取值范围:已存在的分区名称。

    优化建议

    • cluster
      • 建议在新近聚簇的表上运行ANALYZE。否则,优化器可能会选择很差劲的查询规划。
      • 不允许在事务中执行CLUSTER。