ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
        cluster命令是postgresql基于`index_name`所指定的索引来聚簇`table_name`所指定的表,因此,该索引必须已经定义在`table_name`上。         cluster命令可以使用指定索引上的一次索引扫描或者遵循排序的一次顺序扫描(如果索引是 B 树)对表重新排序,当一个表被聚簇时,会基于索引信息对它进行物理上的排序。聚簇是一种一次性的操作:当表后续被更新时,更改没有被聚簇。也就是说,不会尝试根据新行或者被更新行的索引顺序来存储它们。         当一个表被更新时,PostgreSQL会记住它是按照哪个索引聚簇的。形式``CLUSTER*`table_name`*``会使用前面所用的同一个索引对表重新聚簇。你也可以使用`CLUSTER`或者`ALTER TABLE`的`SET WITHOUT CLUSTER`形式把索引设置为可用于 未来的聚簇操作,或者清除任何之前的设置。         不带任何参数的`CLUSTER`会重新聚簇调用用户所拥有的当前数据库中已经被聚簇过的表(如果是超级用户调用,则是 所有已被聚簇过的表)。这种形式的`CLUSTER`不能在一个事务块内执行。 **优点:** * 在随机访问一个表中的行时,表中数据的实际顺序是无关紧要的。 不过,如果你想要更多地访问其中一些数据,并且有一个索引把它 们分组在一起,使用`CLUSTER`就会带来好处 * 如果从一个表中要求一个范围的被索引值或者多行都匹配的一个单一值,`CLUSTER`就会有所帮助,因为一旦该索引标识出了第一个匹配行所在的表页,所有其他匹配行很可能就在同一个表页中,并且因此节省了磁盘访问并且 提高了查询速度 **缺点:** * 当一个表被聚簇时,会在其上要求一个`ACCESS EXCLUSIVE`锁。这会阻止任何其他数据库操作(包括读和写) 在`CLUSTER`结束前在该表上操作。 * 聚簇是一种一次性的操作,如果要实现表被更新后实时聚簇,则需要在第一次手动聚簇之后,设置定时脚本,因为`CLUSTER`会记住哪些索引被聚簇,定期执行不带任何参数的`CLUSTER`,这样那些表就会被周期性地重新聚簇 **命令格式:** * CLUSTER [VERBOSE] table_name [ USING index_name ] * CLUSTER [VERBOSE] > **option:** > * table_name:指定表名 > * index_name:指定索引 > * verbose:在每一个表被聚簇时打印一个进度报告 | 命令实例 | 解释 | | --- | --- | | CLUSTER employees USING employees_ind; | 基于索引`employees_ind`聚簇表`employees` | | CLUSTER employees; | 使用之前用过的同一个索引聚簇`employees`表 | | CLUSTER | 对数据库中以前被聚簇过的所有表进行聚簇 |