聚簇

    聚簇是指:如果一组表有一些共同的列,则将这样一组表存储在相同的数据库块中;聚簇还表示把相关的数据存储在同一个块上。利用聚簇,
一个块可能包含多个表的数据。概念上就是如果两个或多个表经常做链接操作,那么可以把需要的数据预先存储在一起。聚簇还可以用于单个表,
可以按某个列将数据分组存储。
    更加简单的说,比如说,EMP表和DEPT表,这两个表存储在不同的segment中,甚至有可能存储在不同的TABLESPACE中,因此,他们的数据一定不会
在同一个BLOCK里。而我们有会经常对这两个表做关联查询,比如说:select * from emp,dept where emp.deptno = dept.deptno .仔细想想,查询
主要是对BLOCK的操作,查询的BLOCK越多,系统IO就消耗越大。如果我把这两个表的数据聚集在少量的BLOCK里,查询效率一定会提高不少。

1.创建一个簇
size参数,代表所有包含deptno字段的行的平均长度
create cluster my_clu(deptno number) size 38;(在cluster下创建的表的这个字段deptno必须有且数据类型要一致)


2.在簇下面创建簇表
create table d(deptno number,dname varchar2(14),loc varchar2(13)) cluster my_clu(deptno);


3.尝试对D表做插入操作
SQL> insert into d select * from dept;
insert into d select * from dept
            *
ERROR at line 1:
ORA-02032: clustered tables cannot be used before the cluster index is built
报错,提示,簇在没有索引的情况下,不允许对簇下面的所有簇表做DML操作

4.创建簇的索引
create index idx_clu on cluster my_clu;
再次尝试插入,成功
insert into d select * from dept;

5.再创建一张簇表
create table e(
EMPNO                                             NUMBER(4),
 ENAME                                              VARCHAR2(10),
 JOB                                                VARCHAR2(9),
 MGR                                                NUMBER(4),
 HIREDATE                                           DATE,
 SAL                                                NUMBER(7,2),
 COMM                                               NUMBER(7,2),
 DEPTNO                                             NUMBER)
cluster test(deptno);

insert into e  select * from emp;

6.检查创建的簇表
select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BONUS                          TABLE
D                              TABLE            1
DEPT                           TABLE
E                              TABLE            2
EMP                            TABLE
MY_CLU                         CLUSTER
SALGRADE                       TABLE


7.删除簇表,与删除普通的表一样
drop table e purge;

8.删除簇
drop cluster my_clu;
drop cluster my_clu
*
ERROR at line 1:
ORA-00951: cluster not empty
在簇中有簇表的情况下,不能直接删除cluster簇


删除簇的同时,删除簇中所有的簇表
drop cluster my_clu including tables;

删除的时候,还要同时删除外键约束
drop cluster my_clu including tables cascade constraints;


filelist链表才会使用cluster
现在是本地管理,不会使用cluster
cluseter:是,在物理上就是扎堆的意思
如果了解表的平均的行长,就可以使用size(平均行长)

SQL> create cluster test(deptno number)
  2  size 1024;

Cluster created.


如果不知道就走默认
SQL> create cluster test1(deptno number)--cluster表要有cluster的字段
Cluster created.

将普通的表--------->cluster要先收集统计信息,确定行长
收集统计信息的时候cascade=true就是连索引一起收集


cluster:里面有很多表,所有表的平均行长来设置
         表不多的情况下,使用最大的行长

SQL> select table_name,avg_row_len from user_tables;

TABLE_NAME               AVG_ROW_LEN
------------------------------ -----------
DEPT                    20
EMP                    38
cluster表中的数据类型与cluster中的数据类要一致

alter table emp enable constraint emp_fk;取消主键

alter table emp disable constraint emp_fk;激活主键


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值