CLUSTER
CLUSTER - 根据索引对表进行聚类
语法格式
CLUSTER [VERBOSE] table_name [ USING index_name ]
CLUSTER [VERBOSE]
说明
CLUSTER 指示Vastbase E100根据 index_name 指定的索引对 table_name指定的表进行聚类。索引必须已在 table_name 上定义。
当表被聚类时,它将根据索引信息进行物理重新排序。 集群是一次性操作:随后更新表时,更改不会集群。也就是说,不会尝试根据其索引顺序存储新行或更新的行。(如果有人愿意,可以通过再次发出命令来定期重新集群。此外,将表的fillfactor存储参数说明设置为小于100%有助于在更新期间保留集群排序,因为如果有足够的空间,更新的行将保留在同一页面上在那里。)
当一个表被聚类时,Vastbase E100会记住它聚集的索引。表单 CLUSTER table_name 使用与以前相同的索引重新集群表。您还可以使用CLUSTER 或 SET WITHOUT CLUSTER 形式的 ALTER TABLE来设置索引,以用于将来的 集群操作,或清除任何以前的设置。
没有任何参数说明的 CLUSTER重新集群调用用户拥有的当前数据库中的所有先前集群表,或者超级用户调用所有此类表。这种形式的CLUSTER 无法在事务块中执行。
在对表进行 集群 时,会在其上获取 ACCESS EXCLUSIVE锁。这可以防止任何其他数据库操作(读取和写入)在表上运行,直到 CLUSTER完成。
参数说明
table_name
表的名称(可能是模式限定的)。
index_name
索引的名称。
VERBOSE
在每个表都已 集群 时打印进度报告。
注意事项
如果您在表中随机访问单行,则表中数据的实际顺序并不重要。但是,如果您倾向于访问某些数据而不是其他数据,并且有一个索引将它们组合在一起,您将受益于使用CLUSTER 。如果要从表中请求一系列索引值,或者从多个行匹配的单个索引值,CLUSTER将有所帮助,因为一旦索引标识匹配的第一行的表页,所有其他匹配的行可能是已经在同一个表页面上,因此您可以节省磁盘访问并加快查询速度。
CLUSTER可以使用指定索引上的索引扫描重新排序表,或者(如果索引是b-tree)顺序扫描然后排序。它将尝试根据规划器成本参数说明和可用的统计信息选择更快的方法。
使用索引扫描时,将创建包含索引顺序中的表数据的表的临时副本。还会创建表中每个索引的临时副本。因此,您需要磁盘上的可用空间至少等于表大小和索引大小的总和。
使用顺序扫描和排序时,还会创建临时排序文件,以便峰值临时空间要求是表大小加上索引大小的两倍。此方法通常比索引扫描方法更快,但如果磁盘空间要求不可容忍,则可以禁用此选项暂时将enable_sort设置为 off 。
建议在 集群 之前将 maintenance_work_mem设置为一个相当大的值(但不能超过您可以专用于 CLUSTER 操作的RAM量)。
由于计划程序记录有关表排序的统计信息,因此建议在新的集群表上运行ANALYZE。否则,规划人员可能会对查询计划做出糟糕的选择。
因为 CLUSTER 会记住哪些索引是 集群 的,所以可以在第一次手动 集群 要手动集群的表,然后设置一个执行CLUSTER而没有任何参数说明的定期维护脚本,以便定期重新集群所需的表。
示例
基于索引employees_ind聚簇表 employees:
CLUSTER employees USING employees_ind;
使用之前用过的同一个索引聚簇employees表:
CLUSTER employees;
对数据库中以前被聚簇过的所有表进行聚簇:
CLUSTER;