首页 > 数据库 > PostgreSQL > 正文

PostgreSQL7.0手册-用户手册-19. SQL命令-CLUSTER

2019-09-08 23:33:04
字体:
来源:转载
供稿:网友
CLUSTER
名称
CLUSTER ― 向服务器给出存储建簇的建议 
  
语法
CLUSTER indexname ON table
输入
indexname 
一个索引名称. 
table 
表的名称. 
输出
CLUSTER 
成功建簇. 
ERROR: relation  inherits "table" 
表 tablerelation_number 是从表 "table"继承来的 
ERROR: Relation table does not exist! 
表 table 不存在 
描述
CLUSTER 指示 Postgres 近似地基于索引 indexname 的度量对表 table 进行存储建簇.索引必须已经在表 table 上定义了. 
当对一个表建簇后,该表的物理存储将基于索引信息进行.建簇是静态的,也就是说,当表被更新后,改变的内容不会建簇.不会试图对更新过的记录重新建簇.如果需要,可以通过手工执行该命令的方法重建簇. 

注意
该表实际上按索引顺序拷贝到了一个临时表中,然后重新改成原名.因此,在建簇时所有赋予的权限和其它索引都将丢失. 
如果你只是随机的访问表中的行,那么在堆表中的数据的实际存储顺序是无关紧要的.但是,如果你对某些数据的访问多于其他数据,而且有一个索引将这些数据分组,那你就将从 CLUSTER 中获益. 

另一个 CLUSTER 很有帮助的例子是当你用索引从一个表中取出几个记录时.如果你从一个表中请求一定索引范围的值,或者是一个索引过的值对应多行,CLUSTER 也会有助于应用,因为如果索引标识出第一匹配行所在的堆存储页,所有其他行也可能已经在同一堆存储页里了,这样便节省了磁盘访问的时间,加速了查询. 

有两种建簇的数据.第一种是用 CLUSTER 命令,此命令将原表按你声明的索引重新排列.这个动作在操作大表时可能会很慢,因为每一行都从堆存储页里按索引顺序取出,如果存储页表没有排序,整个表是随机存放在各个页面的,因而每行都要进行依次磁盘页面操作.Postgres 有一个缓冲,但一个大表的主体是不可能都放到缓冲去的. 

另一个对数据建簇的方法是使用 

SELECT columnlist INTO TABLE newtable
     FROM table ORDER BY columnlist
这个用法使用 Postgres 排序的代码 ORDER BY 来匹配索引,在对未排序的数据操作时速度快得多.然后你可以删除旧表,用 ALTER TABLE/RENAME 将 temp 改成旧表名,并且重建所有索引.唯一的问题是 OID 将不保留.这时再做 CLUSTER 将快得多,因为大多数堆栈数据已经排过序了而且使用现有的索引. 
用法
以雇员的薪水属性对雇员关系建簇. 
CLUSTER emp_ind ON emp;
兼容性
SQL92
在 SQL92 规范里没有 CLUSTER 语句.
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选