CLUSTER
功能描述
根据索引对表进行聚簇排序。
- CLUSTER基于索引名指定的索引来聚簇由表名指定的表。索引名指定的索引必须已经定义在指定表上。
- 当对一个表聚簇后,该表将基于索引信息进行物理排序。聚簇是一次性操作:当表被更新之后, 更改的内容不会被聚簇。也就是说,系统不会试图按照索引顺序对新的存储内容及更新记录进行重新聚簇。
- 在对表聚簇时,GaussDB(DWS)会记录在哪个索引上建立了聚簇。 形式CLUSTER table_name会使用前面所用的同一个索引对表重新聚簇。用户也可以用CLUSTER或ALTER TABLE的SET WITHOUT CLUSTER形式来设置索引用于后续的聚簇操作或清除任何之前的设置。
- 不带任何参数的CLUSTER会将当前用户所拥有的数据库中的已执行过聚簇的所有表重新聚簇,如果是系统管理员调用,则是所有已被聚簇过的表。
- 在对表进行聚簇时,会在其上请求ACCESS EXCLUSIVE锁。这样避免了在CLUSTER完成之前对此表执行其它的操作(包括读写)。
注意事项
- CLUSTER不允许在事务中执行。
- HDFS表不能进行CLUSTER操作。
- 全局临时表不能进行CLUSTER操作。
- 对表执行CLUSTER操作时会触发表重建(表重建过程中会先把数据转储到一个新的数据文件中,重建完成之后会删除原始文件),当表比较大时,重建会消耗较多的磁盘空间。当磁盘空间不足时,要谨慎对待大表CLUSTER操作,防止触发集群只读。
- 存算分离架构下,对CLUSTER全库的操作会有提示不支持。
- 只有行存B-Tree索引支持CLUSTER操作。
- 如果用户只是随机访问表中的行,那么表中数据的实际存储顺序是无关紧要的。但是, 如果对某些数据的访问多于其它数据,而且有一个索引将这些数据分组, 那么使用CLUSTER会有所帮助。如果从一个表中请求一定索引范围的值, 或者是一个索引值对应多行,CLUSTER也会有所帮助,因为如果索引标识出第一匹配行所在的存储页,所有其它行也可能已经在同一个存储页里了,因此可以节省磁盘访问的时间并加快查询速度。
- 在聚簇过程中,系统先创建一个按照索引顺序建立的表的临时副本,同时也创建了表上每个索引的临时副本。因此,磁盘上需要有足够的可用空间, 至少等于表大小和索引大小的总和。
- 由于CLUSTER会记忆聚集信息,因此可以在第一次手动对要聚簇的表进行聚簇,然后设置一个定期维护脚本,这样就可以周期地自动对表进行聚簇操作。
- 因为优化器会记录有关表排序的统计信息,所以建议在新的聚簇表上运行ANALYZE。否则,优化器可能会选择错误的查询规划。
语法格式
- 对指定表进行聚簇排序。
1
CLUSTER [ VERBOSE ] table_name [ USING index_name ];
- 对指定分区进行聚簇排序。
1
CLUSTER [ VERBOSE ] table_name PARTITION ( partition_name ) [ USING index_name ];
- 对已执行过聚簇的表重新进行聚簇。
1
CLUSTER [ VERBOSE ];
参数说明
参数 |
描述 |
取值范围 |
---|---|---|
VERBOSE |
启用显示进度信息。 |
- |
table_name |
表名称。 |
已存在的表名称。 |
index_name |
索引名称。 |
已存在的索引名称。 |
partition_name |
分区名称。 |
已存在的分区名称。 |
示例
创建一个分区表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
CREATE TABLE tpcds.inventory_p1 ( INV_DATE_SK INTEGER NOT NULL, INV_ITEM_SK INTEGER NOT NULL, INV_WAREHOUSE_SK INTEGER NOT NULL, INV_QUANTITY_ON_HAND INTEGER ) DISTRIBUTE BY HASH(INV_ITEM_SK) PARTITION BY RANGE(INV_DATE_SK) ( PARTITION P1 VALUES LESS THAN(2451179), PARTITION P2 VALUES LESS THAN(2451544), PARTITION P3 VALUES LESS THAN(2451910), PARTITION P4 VALUES LESS THAN(2452275), PARTITION P5 VALUES LESS THAN(2452640), PARTITION P6 VALUES LESS THAN(2453005), PARTITION P7 VALUES LESS THAN(MAXVALUE) ); |
创建索引ds_inventory_p1_index1。
1
|
CREATE INDEX ds_inventory_p1_index1 ON tpcds.inventory_p1 (INV_ITEM_SK) LOCAL; |
对表tpcds.inventory_p1进行聚簇。
1
|
CLUSTER tpcds.inventory_p1 USING ds_inventory_p1_index1; |
对分区p3进行聚簇。
1
|
CLUSTER tpcds.inventory_p1 PARTITION (p3) USING ds_inventory_p1_index1; |
对数据库中可以进行聚集的表进聚簇。
1
|
CLUSTER; |