聚簇表

10 篇文章 0 订阅

索引聚簇:将一组表中相同列存放在相同数据块上,就是把相关数据存放在一起。

create   cluster cluster_emp_dept(no number ) size 1024;---创建簇  size就是确定一个cluster键占用多少空间。
create index cluster_emp_dept_inx on cluster cluster_emp_dept ;--创建聚簇索引 这个索引必须在插入数据前创建
create table emp(name varchar2(100),deptno number) cluster cluster_emp_dept(deptno);
create table dept(name varchar2(100),no number)cluster cluster_emp_dept(no);

insert into emp (name ,deptno)values('1',1);
insert into dept (name ,no)values('1',1);

通过视图查询

select  * from all_objects t where t.data_object_id=(select distinct dbms_rowid.rowid_object(rowid) from emp)



select rowid from emp;
select rowid from dept;

会发现rowid是一样

查看相同no是不是在一个块里面

select dbms_rowid.rowid_block_number(t.rowid),dbms_rowid.rowid_block_number(t1.rowid)
from dept t, emp t1 where t.no=t1.deptno;


查看size 1024 作用

truncate cluster cluster_emp_dept;删除emp和dept所有数据HWM为0

添加8(1024×8=db_block_size 因为其他需要占用一部分空间 所以需要两个块)条
begin
for i in 1..8 loop
insert into emp (name ,deptno)values(''||i,i);
insert into dept (name ,no)values(''||i,i);
end loop;
end;
select   dbms_rowid.rowid_block_number(t.rowid),dbms_rowid.rowid_block_number(t1.rowid)
from dept t, emp t1 where t.no=t1.deptno;


刚好第八行存入另一个块中



索引聚簇表特点:

1、索引聚簇表的DML操作时间长,管理数据需要许多操作。

2、对索引聚簇表进行全表扫描时,需要注意的是不仅仅是扫描该表,还要扫描多张表。但表扫描时间长。

3、索引聚簇中的表和索引聚簇不能分区。

4、索引聚簇上的表不能truncate table 但是可以truncate cluster 

5、如果索引聚簇表之间通过据簇键关联,这时性能非常好,较少oracle缓存块个数

缺点:需要精确计算size参数,太大导致空间浪费。太小导致行迁移

创建时间长:需要分配大量空间,初始表所占用空间大,从而导致管理复杂

全表扫面时,因为都分配了空间,所有初始空间在HWM之下,所以扫描量非常大(聚簇是为了据簇键快速找到数据,不是为了全表扫描)


另一种聚簇表——哈希聚簇表,聚簇键值是指定聚簇字段值的哈希值。分配空间情况是:hashkeys/(trunc(blocksize/size))

create cluster cluster_hash_emp_dept(no number) hashkeys 1000 size 1024;
-- Create table
create table EMP1
(
  NAME   VARCHAR2(100),
  DEPTNO NUMBER
)
cluster cluster_hash_emp_dept (DEPTNO);
-- Create table
create table DEPT1
(
  NAME VARCHAR2(100),
  NO   NUMBER
)
cluster cluster_hash_emp_dept (NO);

begin 
        for i in 1..10 loop
            insert into EMP1 values(''||i,i);
            insert into DEPT1 values(''||i,i);
        end loop;
        commit;
end;


在hashkeys值选择方面,oracle会根据一个最接近于hashkeys大于等于质数,所以1000的最接近的质数是1009,它所需的最小初始数据块数为1009/(8192/1024)

使用hash聚簇,当你插入第1010个部门时,会导致hash键值冲突(两个hash值一样,要尽量避免冲突,因为它增加了开销,使得块串联的可能性增加),hash聚簇最大优点是等值查找


HASH TABLE小结

1) 散列聚簇一开始就要分配空间。Oracle根据你的HASHKEYS和SIZE来计算HASHKEYS/trunc
(blocksize/SIZE),立即分配空间,并完成格式化,一旦将第一个表放入这个聚簇中,任何
   全面扫描都会命中每一个已分配的块。在这方面,它与其他的所有表都不同。


2) 散列聚簇中的HASHKEY 数是固定大小的。除非重新聚簇,否则不能改变散列表的大小。这
    并不会限制聚簇中能存储的数据量,它只是限制了能为这个聚簇生成的惟一散列键的个数。如
    果HASHKEY 值设置得太低,可能因为无意的散列冲突影响性能。


3) 不能在聚簇键上完成区间扫描。诸如WHERE cluster_key BETWEEN 50 AND 60 谓词条件
    不能使用散列算法。介于50~60 之间的可能值有无限多个,服务器必须生成所有可能的值,并
    分别计算散列,来查看相应位置是否有数据。这是不可能的。如果你在一个聚簇键上使用区间
    扫描,而且没有使用传统索引,实际上会全面扫描这个聚簇。


HASHED TABLE的要点是:
1)HASHED TABLE中是把传递到查询的需求转换成一个FILE/BLOCK,并且直接读,不经过索引.
2)HASHED TABLE的I/O要少得多,因为heap table要至少做一次I/O来获取rowid,然后通过rowid来访问表,前者访问缓存次数是后者的1/3
3)散列聚簇查询与索引查询所用的CPU是一样的,尽管它访问buffer hash的次数要少得多

但执行hash是一个CPU相当密集的操作(索引是I/O密集的操作).这里要做个权衡.


单表散列据簇表

create cluster cluster_single (  no number) hashkeys 1000 size 1024  single table;

create table cluster_single_table_emp( no  number,name varchar2(200)) cluster cluster_single(no);

单表散列聚簇表能够更快的结束数据查询,更少的latch锁


有序散列聚簇表

create cluster cluster_single (  no number,dt  datetime sort) hashkeys 1000 size 1024 hash is no ;

create table cluster_single_table_emp( no  number,name varchar2(200),dt datetime sort) cluster cluster_single(no);







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值