ITPub博客

首页 > 数据库 > Oracle > 聚簇 聚簇索引和聚簇下的表的记载

聚簇 聚簇索引和聚簇下的表的记载

原创 Oracle 作者:dotaddjj 时间:2011-09-14 23:22:08 0 删除 编辑

前段时间又重新理解了一下cluster,觉得有必要整理以后再拿来看看,cluster当初自己也是很理解不通,现在自己又在看oracle concept就查查资料扫盲了,要从根本上理解。

根据一个表占用一个segment,然后为其分配extent,所以此extent中的block都是存储的这个表的数据信息,不存在别的表的数据信息。这样如果做表的关联时:

select a.id ,b.name from test01 a,test02 b where a.id=b.id and a.id=10;

很明显要访问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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    220
  • 访问量
    1662977