簇的概念

1 簇概念:
是一组表,如果应用程序中的SQL 语句经常联结两个或多个表,可以把这些表以簇方式进行创建以改善性能。簇中的表存储在相同的数据块中,并且各个表中的相同的列值只存储一个。
簇(Cluster)就是将一组有机联系的表在物理上存放在一起并且相同的关键列的值只存储一份,用于提高处理效率的一项技术
2限制:

 

 

 

l簇中的每个表必须有一列与簇中指定的列的 大小和类型匹配;

 

l簇码中可用列的最大数目是 16,即一个簇最多有16列作为簇码;

 

l列的最大长度为 239字节;

 

lLONG 和 LONG RAW 不能作为簇列码。
3 3 建立簇:
1) 创建簇语法

 

 

CREATE CLUSTER cluster

 

( column datatype[,colmn datatype] )

 

[PCTUSED 40|intger] [ PCTFREE 10| intger]

 

[ SIZE intger ]

 

[INITRANS 1|intger] [MAXTRANS 255|intger]

 

[TABLESPACE tablespace]

 

[STORAGE storage]

 

 

 

 

2)创建簇及其表的步骤:

 

l用 CREATE CLUSTER创建簇

 

l用 CREATE INDEX创建簇索引

 

l用 CREATE TABLE 创建表,并指定簇

 

l插入数据并进行 DML 操作

 

 

4 改变簇:
在用户具有 ALTER ANY CLUSTER 的权限情况下,可以对已建好的簇(CLUSTER )改变其设置,如:

 

 

l物理属性: PCTFREE,PCTUSED,INITRANS,MAXTRANS和STORAGE;

 

l为 CLUSTER 关键字值存储所有行所需的一般空间容量;

 

l缺省平行度。

 

 

命令语法:

 

ALTER CLUSTER Cluster_name

 

{ PCTUSED integer

 

| PCTFREE integer

 

| SIZE integer

 

| INITRANS integer

 

| MAXTRANS integer

 

| STORAGE Cluase

 

}

 

 

5 删除簇:
只要用户具有 DROP ANY CLUSTER 权限均可以对所有的CLUSTER 进行删除。

 

 

语法如下:

 

DROP CLUSTER [user.]cluster [INCLUDING TABLES]

 

 

 

 

 

 

6 收集簇信息:

 

 

删除簇索引:一个簇的索引可以被删除而不影响表的数据,但是当簇的索引被删除后,属于该簇的表就变为不可用,所以当删除簇的索引后还须再建立该簇的索引才行。有时为了消除盘空间的碎片我们常进行删除簇索引操作。

 

 

lDBA_CLU_COLUMNS 或 USER_CLU_COLUMNS

 

lDBA_CLUSTERS或 USER_CLUSTER

 

---------------

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1105716

1. 什么是聚簇

聚簇是根据码值找到数据的物理存储位置,从而达到快速检索数据的目的。聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点。非聚簇索引的顺序与数据物理排列顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。一个表最多只能有一个聚簇索引。

 

2. 使用 Oracle 聚簇索引

 

聚簇是一种存储表的方法,这些表密切相关并经常一起连接进磁盘的同一区域。例如,表 BOOKSHELF 和BOOKSHELF_AUTHOR 数据行可以一起插入到称为簇(Cluster)的单个区域中,而不是将两个表放在磁盘上的不同扇区上。簇键(Cluster Key)可以是一列或多列,通过这些列可以将这些表在查询中连接起来(例如,BOOKSHELF表和BOOKSHELF_AUTHOR表中的 Title列)。为了将表聚集在一起,必须拥有这些将要聚集在一起的表。

 

下面是create cluster命令的基本格式:

 

          
          create cluster (column datatype [, column datatype]...) [other options];

 

cluster的名字遵循表命名约定,column datatype是将作为簇键使用的名字和数据类型。column的名字可以与将要放进该簇中的表的一个列名相同,或者为其他有效名字。下面是一个例子:

 

          
          create cluster BOOKandAUTHOR (Col1 VARCHAR2(100));

 

这样就建立了一个没有任何内容的簇(象给表分配了一块空间一样)。COL1的使用对于簇键是不相干的,不会再使用它。但是,它的定义应该与要增加的表的主键相符。接下来,建立包含在该簇中的表:

 

          
          create table BOOKSHELF    (Title VARCHAR2(100) primary key,    Publisher VARCHAR2(20),    CategoryName VARCHAR2(20),    Rating VARCHAR2(2),    constraint CATFK foreign key (CategoryName) references CATEGORY(CategoryName)    )    cluster BOOKandAUTHOR(Title);

 

在向BOOKSHELF表中插入数据行之前,必须建立一个聚簇索引:

 

          
          create index BOOKandAUTHORndx on cluster BOOKandAUTHOR;

 

在上面的create table语句中,簇BOOKandAUTHOR(Title)子句放在表的列清单的闭括号的后面。BOOKandAUTHOR是前面建立的聚簇的名字。Title是将存储到聚簇Col1中的该表的列。create cluster语句中可能会有多个簇键,并且在created table语句中可能有多个列存储在这些键中。请注意,没有任何语句明确说明Title列进入到Col1中。这种匹配仅仅是通过位置做到的,即Col1和Title都是在它们各自的簇语句中提到的第一个对象。多个列和簇键是第一个与第一个匹配,第二个与第二个匹配,第三个与第三个匹配,等等。现在,添加第二个表到聚簇中:

 

          
          create table BOOKSHELF_AUTHOR    (Title VARCHAR2(100),    AuthorName VARCHAR2(50),    constraint TitleFK Foreign key (Title) references BOOKSHELF(Title),    constraint AuthorNameFK Foreign key (AuthorName) references AUTHOR(AuthorName)    )    cluster BOOKandAUTHOR (Title);

 

当这两个表被聚在一起时,每个唯一的Title在簇中实际只存储一次。对于每个Title,都从这两个表中附加列。

来自这两个表的数据实际上存放在一个位置上,就好像簇是一个包含两个表中的所有数据的大表一样。

 

3. 散列聚簇

 

对于散列聚簇,它只有一个表。它通过散列算法求出存储行的物理存储位置,从而快速检索数据。创建散列聚簇时要指定码列的数据类型,数据行的大小及不同码值的个数。如果码值不是平均分布的,就可能有许多行存储到溢出块上,从而会降低查询该表的SQL语句的性能。

 

散列聚簇被用在总是通过主键查询数据的情况,例如要从表 T 查询数据并且查询语句总是是这样:

 

          
          select * from T where id = :x;

 

 

 

 

这时散列聚簇是一个好的选择,因为不需要索引。Oracle 将通过散列算法得到值 :x 所对应的物理地址,从而直接取到数据。不用进行索引扫描,只通过散列值进行一次表访问。

 

散列聚簇语法示例:

 

          
          CREATE CLUSTER personnel    ( department_number NUMBER )    SIZE 512 HASHKEYS 500    STORAGE (INITIAL 100K NEXT 50K);    CREATE CLUSTER personnel    ( home_area_code NUMBER,    home_prefix NUMBER )    HASHKEYS 20    HASH IS MOD(home_area_code + home_prefix, 101);    CREATE CLUSTER personnel    (deptno NUMBER)    SIZE 512 SINGLE TABLE HASHKEYS 500;



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1105716

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值