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. js之正则表达式基础

    字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦, ...

  2. python 基础 知识

    Python Python 是一种强类型 的解释型 动态型语言Python 对象中的不可变 数字,字符串,元组 ,对于不能改变的会创建一个新的                可变  列表 , 字典   ...

  3. java几种常见的排序算法总结

    /*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu { final int  ...

  4. Spring课程 Spring入门篇 4-9 Spring bean装配之对jsr支持的说明

    1 解析 1.1 疑问:2.2去掉@resource注解,为什么不能赋值?不是有set方法了吗? 1.2 @resource注解版本支持 1.3 没有显式指定@resource的那么,默认名称从何获得 ...

  5. Stage6--Python简单爬虫

    正则表达式简单介绍 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 字符 ...

  6. CocoaPods管理的项目移植到别人电脑后找不到头文件

    CocoaPods管理的项目移植到别人电脑后找不到头文件 在TARGETS -> Search Paths -> User Header Search Paths 中 写入 ${SRCRO ...

  7. 使用weinre调试Web应用及PhoneGap应用

    Web开发者经常使用Firefox的firebug或者Chrome的开发人员工具进行Web调试,包括针对JavaScript,DOM元素和CSS样式的调试.但是,当我们期望为移动Web站点或应用进行调 ...

  8. siebel 界面搭建

    Siebel界面的初步搭建都是基于Siebel Tools工具来创建的,其搭建步骤: 1. 首先先创建一个Project项目,点击project--->点 new Record--->输入 ...

  9. Dynamics CRM 之团队模板

    位置:设置——安全性——访问团队模板 实体:关联实体,若关联了实体,相关关联的角色可以对当前实体进行下列访问权限的操作: 团队模板的赋值: 插件代码 //通过团队模板名称获取团队模板 var team ...

  10. 关于移动App开发前端UI框架选择

    问题:现在移动开发各种必须,而移动开发纠结在于怎样快速高效的开发出来. 做web开发有些年头了,成熟的前端套件(easyui,extjs,jqueryui)很是方便,可以开发出来规范一直的产品,各种组 ...