第二章 SQL参考命令-CLUSTER

来源:互联网 发布:大圣归来 制作软件 编辑:程序博客网 时间:2024/04/28 11:42

CLUSTER

根据一个索引对磁盘上的物理重新排序堆存储表。Greenplum数据引擎不推荐此操作

概要

CLUSTER indexname ON tablename

CLUSTER tablename

CLUSTER

描述

When a table is clustered using thiscommand, Greenplum Database remembers on which index it was clustered. The formcluster tablename reclusters the table on the sameindex that it was clustered before. CLUSTER without any parameter reclustersall previously clustered tables in the current database that the calling userowns, or all tables if called by a superuser. This form of cluster cannot be executedinside a transaction block.

When a table is being clustered, an access exclusive lock isacquired on it. This prevents any other database operations (both reads andwrites) from operating on the table until the CLUSTER is finished.

CLUSTER命令会通过索引将基于堆表的数据进行重新排序,CLUSTER不支持追加优化表。通过索引进行聚类意味着记录会依照索引的信息进行物理上的排序。如果你要进行排序的数据是随机分布的,则数据库必须在磁盘上进行随机扫描以便找到这些记录。如果这些记录存储的位置很紧密,则数据读取就会更顺序化。一个聚类的很好的例子就是数据按照日期进行散列。对一个特定日期范围的数据查询就意味着对磁盘的一个顺序方位,从而获取更快的数据读取速度。聚类是一次性的操作,如果表在随后又发生了更新,则新的更改不会被聚集。也就是说,新的数据不会按照索引的顺序进行存储。如果希望数据按照索引的顺序进行存储,则隔一段时间就进行一次CLUSTER。

如果一个表使用这个命令,则GPDB就会记录这个表是通过哪个索引进行聚集的。这个命令cluster tablename 就会按照之前参照的索引对这个表进行重新的聚集。如果没有任何参数,那这个命令就会在当前的数据库上聚集这个用户的所有的表。如果用户是超级用户,则会处理所有的表。CLUSTER命令无法再一个事务块中执行。

当一个表正在进行CLUSTER时,会获得一个access exclusive锁。在命令完成之前,对此表的任何的数据库读写都无法进行。

parameter

indexname The name of an index.

Tablename The name(optionally schema-qualified) of a table.

注意

 

在表中随机访问单行的情况下,表中数据的实际顺序不重要。但是如果你想主要访问某些数据,并且将这些数据组合到一个索引中,则使用CLUSTER命令会获得好处。如果要从表中请求一系列索引值,或者具有与多个行匹配的单个索引值,则CLUSTER将有所帮助,因为一旦索引标识与匹配的第一行的表页,则所有其他匹配的行可能是已经在同一个表页面上,因此您可以节省磁盘访问并加快查询速度。

在命令操作期间,会创建表的副本,这个副本包含着按照索引顺序排序的数据。与此同时,也会复制这个表的每个索引。所以,你至少需要有等于表大小和索引大小之和的磁盘可用空间。

 

巳由于查询优化器记录关于表的顺序的统计信息,建议在新聚簇表上运行ANALYZE。否则,计划者可能会对查询计划做出不好的选择。

 

还有另一种聚类数据的方式。 CLUSTER命令通过使用您指定的索引扫描原始表来重新排序。这在大型表格上可能很慢,因为以索引顺序从表中提取行,如果表无序,则条目在随机页面上,因此每个移动的行都检索到一个磁盘页面。 (Greenplum数据库有一个缓存,但大部分的大表不适合缓存。)集群表的另一种方法是使用如下语句:

CREATE TABLE newtable ASSELECT * FROM table ORDER BY column;

这使用Greenplum数据库排序代码来产生所需的顺序,通常要比无序数据的索引扫描快得多。然后,您删除旧表,使用ALTER TABLE ... RENAME将newtable重命名为旧名称,并重新创建表的索引。这种方法的最大缺点是它不保留表的OID,约束,授予权限和其他辅助属性 - 所有这些项必须手动重新创建。另一个缺点是这样需要与表本身大小相同的排序临时文件,因此峰值磁盘使用量大约是表大小的三倍,而不是表大小的两倍。

Note: cluster不支持 append-optimized tables.

示例

Cluster thetable employees on the basis of its index emp_ind:

CLUSTERemp_ind ON emp;

Cluster alarge table by recreating it and loading it in the correct index order:

CREATE TABLE newtable AS SELECT * FROMtable ORDER BY column;

DROP table;

ALTER TABLE newtable RENAME TO table;

CREATE INDEX column_ix ON table (column);

VACUUM ANALYZEtable;

兼容性

There is no cluster statement in theSQL standard.

相关参考

CREA^TE TABLE AS, CREATE INDEX


原创粉丝点击