首页 > 数据库 > Oracle > 聚簇 聚簇索引和聚簇下的表的记载
前段时间又重新理解了一下cluster,觉得有必要整理以后再拿来看看,cluster当初自己也是很理解不通,现在自己又在看oracle concept就查查资料扫盲了,要从根本上理解。
根据一个表占用一个segment,然后为其分配extent,所以此extent中的block都是存储的这个表的数据信息,不存在别的表的数据信息。这样如果做表的关联时:
select a.id ,b.name from test
很明显要访问a表的block和b表的block,访问过多的数据块,I/O操作会更多消耗资源。
簇是用来存储表的方法,一组表有共同的column,聚簇就把这些数据行存储在同一的block中,用于检索时提高效率,聚簇的所在段中的block就会包含不同的表的信息,当然聚簇也可以只存储单个表的数据。
例如上面的sql中我们将id=10的a表和b表的数据行存储在同一block中(如果存储不下了,可以串联另外的块)后续的关联查询就只需要访问这个block,效率肯定会提高。
簇键可以是一列或多列.通过簇键可以将表在查询中连接起来。
创建一个cluster
Creat cluster ashuang_cluster01(col1 varchar2(20))
Size 1024
这样就建立了一个没有任何内容的簇
然后建立包含在该簇中的table
Create table ashuang(
Name varchar2(10),,
Edate date,
Escn number)
Cluster ashuang_cluster01(name);
需要理解的是:聚簇表(这个是聚簇下的表,不是聚簇本身)是基于索引聚簇创建的,里面记录的各个聚簇键,聚簇键和平时所用索引键不一样,索引键指向一行数据,聚簇键指向一个block。
(上面的size 1024是希望每个聚簇键值关联大约1024字节的数据,oracle会在用这个数据库块上设置计算每个块最多能放下多少个聚簇键)
在使用上述cluster中的表之前必须create该聚簇的索引
Create index ashuang_cluster01_index on cluster ashuang_cluster01;
可以理解为:聚簇索引的任务是取得聚簇键值,通过聚簇键值返回包含这个聚簇键的块地址,也就是后续查询 dml都需要获得该聚簇表的block地址来对block进行更新读取,如果该聚簇没有聚簇索引也就无法获取聚簇键值,无法通过聚簇键值定位block,进一步也就无法使用该聚簇下的表了。
一个cluster可能有多个聚簇键,聚簇下的表是通过位置来平匹配聚簇中得聚簇键的,可以尝试创建有两列的聚簇键,然后创建聚簇下的表和索引。
create另一个table到聚簇中
create table ashuang01(
name01 varchar2(20),
Edate date,
Escn number)
Cluster ashuang_cluster01(name01);
查看user_segments还是只有聚簇ashuang_cluster这个聚簇段,不存在ashuang01和ashuang表段,也就更能解释聚簇的原理了,还有聚簇索引也是针对聚簇本身的。
聚簇使用中有些推敲:
1 聚簇中的表如果大量修改:索引聚簇会对dml性能产生负面影响,一般的表段也是如此,因为还要管理索引。(最好实验测试一下)
2 如果多聚簇的某个表全扫描,会以聚簇为单位扫描,也就会聚簇下关联的表,这个本来就应该如此,聚簇就是一个整体的聚簇段。
一般聚簇都能提高检索效率,在一些查询比较多关联多个表段时完全可以用聚簇来提高效率,关于聚簇和truncate中细节暂时没有实验和原理上理解,后面有新的理解了再更新吧
23::00:00了,看一级电视剧睡觉了,再接再厉了!
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1055071/ ,如需转载,请注明出处,否则将追究法律责任。