PHP实战中知识总结 / PgSQL - cluster命令(bin目录文件)
一、cluster
cluster命令是postgresql基于index_name所指定的索引来聚簇table_name所指定的表,因此,该索引必须已经定义在table_name上。
cluster命令可以使用指定索引上的一次索引扫描或者遵循排序的一次顺序扫描(如果索引是 B 树)对表重新排序,当一个表被聚簇时,会基于索引信息对它进行物理上的排序。聚簇是一种一次性的操作:当表后续被更新时,更改没有被聚簇。也就是说,不会尝试根据新行或者被更新行的索引顺序来存储它们。
当一个表被更新时,PostgreSQL会记住它是按照哪个索引聚簇的。形式CLUSTER*`table_name`*会使用前面所用的同一个索引对表重新聚簇。你也可以使用CLUSTER或者ALTER TABLE的SET WITHOUT CLUSTER形式把索引设置为可用于 未来的聚簇操作,或者清除任何之前的设置。
不带任何参数的CLUSTER会重新聚簇调用用户所拥有的当前数据库中已经被聚簇过的表(如果是超级用户调用,则是 所有已被聚簇过的表)。这种形式的CLUSTER不能在一个事务块内执行。
二、优缺点
1、优点
在随机访问一个表中的行时,表中数据的实际顺序是无关紧要的。 不过,如果你想要更多地访问其中一些数据,并且有一个索引把它 们分组在一起,使用CLUSTER就会带来好处
如果从一个表中要求一个范围的被索引值或者多行都匹配的一个单一值,CLUSTER就会有所帮助,因为一旦该索引标识出了第一个匹配行所在的表页,所有其他匹配行很可能就在同一个表页中,并且因此节省了磁盘访问并且 提高了查询速度
2、缺点
当一个表被聚簇时,会在其上要求一个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 | 对数据库中以前被聚簇过的所有表进行聚簇 |