Oracle支持两种类型的聚簇:索引聚簇和哈希聚簇

一.索引聚簇表的原理

聚簇:如果一些表有一些共同的列,则将这样一组表存储在相同的数据块中

聚簇还表示把相关的数据存储在同一个块上。利用聚簇,一个块可能包含多个表的数据。

概念上就是说如果两个表或多个表经常做连接操作,就可以预先把需要的数据也存储在一起。

聚簇还可以用于单个表,可以按某个列将数据分组存储。

简单的说,簇就是一组表,由一组共享相同数据块的多个表组成,将经常一起使用的表组合在一起成簇

就可以提高处理效率。

二.使用方法

建立的顺序:簇——>簇表——>簇索引——>数据

如下

a.创建簇

CREATE CLUSTER my_clu(
deptno NUMBER(10))
PCTUSED 60 
PCTFREE 10
SIZE 1024 --
TABLESPACE USERS
storage(
INITIAL 128k
NEXT 128k
MINEXTENTS 2
MAXEXTENTS 20
);

关于size选项:size为1024表示每个聚簇键关联大约1024字节的数据(1024对于一般的表一条数据没问题)

oracle会用size这个设置来计算每个块最多能放下多少个聚簇键。假设块大小为8kb,oradcle会在每个数据块

上放做多7个聚簇键,也就是说deptno为10-60的数据会放在一个块上,一旦插入部门80,就会使用一个新块,

存放的顺序是和插入顺序相关的。

size控制着每块上聚簇键的最大个数。是对聚簇空间利用率影响最大的因素。如果size设置的过高,那么每个块

上的键就会很少(单位block可以存的聚簇键就少了),会导致不必要的使用过多的空间。如果设置的过低,又会

导致数据过分串链(一个聚簇键不够存放一条数据),就与聚簇本来的目的不符,因为聚簇原本就是为了把相关

数据都存储在一个块上

b.创建簇表

CREATE TABLE t1_dept(
deptno NUMBER(10),
dname VARCHAR2(20))
CLUSTER my_clu(deptno);

CREATE TABLE t1_emp(
empno NUMBER,
ename VARCHAR2(20),
birth_date DATE,
deptno NUMBER(10))
CLUSTER my_clu(deptno);

此时如果直接查询创建的表,将会出现提示

SELECT * FROM t1_dept; --聚簇表无法在索引建立之前使用

c.为簇创建索引

CREATE INDEX clu_index ON cluster my_clu;

j聚簇索引的任务是拿到一个聚簇键值,然后返回包含这个键的block的块地址.实际上这是一个 主键

其中每个聚簇键值指向聚簇本身中的一个块。因此,在请求deptno=10的数据时,oracle会读取聚簇键

确定相应的块地址,然后读取数据

管理聚簇

a.对于簇的修改使用alter,需要具有alter any cluster的权限

ALTER CLUSTER my_clu PCTUSED 40;
b.删除簇

drop cluster my_clu: --仅适用于删除空簇

drop cluster my_clu including tables;--删除簇和簇表

drop cluster my_clu including tables cascade constraints;--同时删除外键约束

c.清空簇

truncate cluster my_clu;

注:所有在此簇上的表的数据全部被清空

三.加载数据

向聚簇表中加载数据需要使用合理的处理方法,否则会使得聚簇的功能发挥不完全,

降低查询的效率

四.不宜使用簇的情况

1.如果预料到聚簇表会大量被修改,聚簇表会对dml的性能造成负面影响

2.非常不适合对单表的全表扫描,因为只能引起对其他表的全表扫描

3.频繁对表进行truncate操作,因为聚簇中的表是不能truncate的,只能清空(truncate)簇

4.如果簇只是欧惹人被连接或他们的公共列经常被吸怪,则不要聚簇表

5.如果经常从所有相同聚簇值得表查询出的结果的数据超过一个或两个oracle块,则不要聚簇表

6.如果空间不够,并且不能为将要插入的新纪录分配额外的空间,那么不要使用簇

oracle聚簇表的理解 (转自:https://blog.csdn.net/gumengkai/article/details/51009345 )的更多相关文章

  1. myeclipse通过数据表生成jpa或hibernate实体---https://blog.csdn.net/partner4java/article/details/8560289

    myeclipse通过数据表生成jpa或hibernate实体-----https://blog.csdn.net/partner4java/article/details/8560289

  2. golang语言并发与并行——goroutine和channel的详细理解(一) 转发自https://blog.csdn.net/skh2015java/article/details/60330785

    如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人. Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据. ...

  3. 系统虚拟内存的理解 转载自http://blog.csdn.net/do2jiang/article/details/4690967

    在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制. 一 早期的内存分配机制 在 早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序 ...

  4. 如何简单地理解Python中的if __name__ == '__main__'(https://blog.csdn.net/yjk13703623757/article/details/77918633)

    1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '_ ...

  5. 使用Mybatis进行连表查询、left join---https://blog.csdn.net/jinzhencs/article/details/51980518

    使用Mybatis进行连表查询.left join https://blog.csdn.net/jinzhencs/article/details/51980518

  6. Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明--转载(http://blog.csdn.net/tianlesoftware/article/details/7777511)

    一.RAC 全局等待事件说明 在RAC环境中,和全局调整缓存相关的最常见的等待事件是global cache cr request,global cache busy和equeue. 当一个进程访问需 ...

  7. Redis中为什么使用跳表---------转自http://blog.csdn.net/u010412301/article/details/64923131

    最近在研究数据库的一些底层实现,百度的面试官问到了跳表,当时没有回答上来,在csdn上看到了这篇文章,感觉写的比较好,希望大家可以多多交流. Redis里面使用skiplist是为了实现sorted ...

  8. MySQL的表分区详解 - 查看分区数据量,查看全库数据量----转http://blog.csdn.net/xj626852095/article/details/51245844

    查看分区数据量,查看全库数据量 USE information_schema; SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PAR ...

  9. oracle的散列聚簇表

    在簇表中,Oracle使用存储在索引中的键值来定位表中的行, 而在散列聚簇表中,使用了散列函数代替了簇索引,先通过内部函数或者自定义的函数进行散列计算,然后再将计算得到的码值用于定位表中的行. 创建散 ...

随机推荐

  1. 修改ThinkPHP的验证码类

    今天用ThinkPHP重新开发一个系统,用到了ThinkPHP的验证码类,由于我希望验证码别太复杂,希望验证码里边只有数字,却发现该Verify类并未提供设置验证码中使用的字符的配置的方法,于是查看源 ...

  2. 关于supersocker的数据传输中遇到的问题

    最近在学socket,在使用socket时数据的传输与接口都是byte,所以文本与文件的传输只要对传过来的byte处理好就可以. 但是在supersocket上,我却花费了很长的时间.原因如下: 1. ...

  3. asp.net MVC3之AJAX实现(json)

    asp.net MVC3之AJAX实现(json)         分类:             Asp.net MVC              2011-08-10 13:55     2272 ...

  4. wex5新增数据库

    首先是要打开Wex5   (这是废话,下面进入正题..) 1.第一步,找到界面中的 ”窗口” 点击打开,你会看到一个 “ 首选项 ”按照流程也要打开 (囧),,,,,,,,看图为重 2.当你打开了 “ ...

  5. springboot+mybatis实现登录功能,返回json

    1.新建maven项目(pom) <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...

  6. Python contextlib.contextmanager

    看着代码又发现了一个奇怪的东西: @contextlib.contextmanager def __call__(self, incoming): result_wrapper = [] yield ...

  7. oracle学习篇四:多表查询

    -----------------产生笛卡儿积------------------------------------ select * from emp,dept; --不带条件时,记录数为14*4 ...

  8. Deep Transfer Network: Unsupervised Domain Adaptation

    转自:http://blog.csdn.net/mao_xiao_feng/article/details/54426101 一.Domain adaptation 在开始介绍之前,首先我们需要知道D ...

  9. Scope_Pre_Post

    @Scope , 设置bean的生命周期,示例:   @Scope(value="prototype")//设置生存范围,一般用 singleton或prototype 14.@P ...

  10. Winform中 DataGridView控件中的 CheckBox 的值读出来 始终 为 False ,已解决

    private void DGV_DetailsViewer_CellContentClick(object sender, DataGridViewCellEventArgs e) { )) { D ...