oracle聚簇表的理解 (转自:https://blog.csdn.net/gumengkai/article/details/51009345 )

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.如果空间不够,并且不能为将要插入的新纪录分配额外的空间,那么不要使用簇

原文地址:https://www.cnblogs.com/lucifa/p/10165861.html

时间: 2024-09-30 23:27:58

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

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

在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制. 一 早期的内存分配机制 在 早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址.当计算 机同时运行多个程序时,必须保证这些程序用到的内存总量要小于计算机实际物理内存的大小.那当程序同时运行多个程序时,操作系统是如何为这些程序分配内存 的呢?下面通过实例来说明当时的内存分配方法: 某台计算机总的内存大小是

SpringMVC<from:form>表单标签和<input>表单标签简介 转http://blog.csdn.net/hp_yangpeng/article/details/51906654

SpringMVC<from:form>表单标签和<input>表单标签简介 在使用SpringMVC的时候我们可以使用spring封装的一系列表单标签,这些标签都可以访问到ModelMap中的内容.下面将对这些标签一一介绍. 在正式介绍SpringMVC的表单标签之前,我们需要先在JSP中声明使用的标签,具体做法是在JSP文件的顶部加入以下指令: Jsp代码 <%@taglib uri="http://www.springframework.org/tags/fo

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. 当一个进程访问需要一个或者多个块时,Oracle会首先检查自己的Cache是否存在该块,如果发现没有,就会先通过global cache赋予这些块共享访问的权限,然后再访问.假如,通过global cache发现这些块已经在另一个实例的Cache里面,那么这些块就会通过Cache Fusion,在节点之间直接传递,

Hibernate不能自动建表解决办法(转载自:http://blog.csdn.net/biangren/article/details/8010018)

最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且在mysql中新建了一个hibernate数据库,仅此而已.然而预想不到的事情发生了……程序写好之后,运行,报错 Hibernate: insert into news_table (title, content) values (?, ?)       Exception in thread "m

oracle rownum ( 原:http://blog.csdn.net/lg312200538/article/details/4587455)

Oracle中rownum用法总结 2009-09-24 10:29 5068人阅读 评论(0) 收藏 举报 oracle数据库csql 对于Oracle的rownum问题,很多资料都说不支持>,>=,=,between……and,只能用以上符号(<.<=.!=),并非说用>,>=,=,between……and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个rownum伪列的意义就不应该感到惊奇,同样是伪列,r

oracle 索引聚簇表的工作原理

作者:Richard-Lui 一:首先介绍一下索引聚簇表的工作原理:(先创建簇,再在簇里创建索引,创建表时指定列的簇类型) 聚簇是指:如果一组表有一些共同的列,则将这样一组表存储在相同的数据库块中:聚簇还表示把相关的数据存储在同一个块上.利用聚簇,一个块可能包含多个表的数据.概念上就是如果两个或多个表经常做链接操作,那么可以把需要的数据预先存储在一起.聚簇还可以用于单个表,可以按某个列将数据分组存储. 更加简单的说,比如说,EMP表和DEPT表,这两个表存储在不同的segment中,甚至有可能存

堆组织表,索引组织表和索引聚簇表

--- 堆组织表就不说了,其索引中记录了记录所在位置的rowid,查找的时候先找索引,然后再根据索引rowid找到块中的行数据 索引组织表,其行数据以索引形式存放,因此找到索引,就等于找到了行数据. -- 堆组织表的数据是散放的,索引和表的数据是分离的 索引组织表的索引和数据是在一起的 -- 堆组织表的存储速度因为不用考虑排序, 所以存储速度会比较快. 但是要查找符合某个条件的记录, 就必须得读取全部的记录以便筛选.而这个时候为了加快查询速度, 索引就出现了, 索引是针对少量特定字段的值拿出来进

[转帖]堆组织表,索引组织表和索引聚簇表

https://www.cnblogs.com/youngerger/p/8446399.html --- 堆组织表就不说了,其索引中记录了记录所在位置的rowid,查找的时候先找索引,然后再根据索引rowid找到块中的行数据 索引组织表,其行数据以索引形式存放,因此找到索引,就等于找到了行数据. -- 堆组织表的数据是散放的,索引和表的数据是分离的 索引组织表的索引和数据是在一起的 -- 堆组织表的存储速度因为不用考虑排序, 所以存储速度会比较快. 但是要查找符合某个条件的记录, 就必须得读取

oracle ITL(事务槽)的理解

一.ITL描述: ITL(Interested Transaction List)是Oracle数据块内部的一个组成部分,位于数据块头(block header),itl由xid,uba,flag,lck和scn/fsc组成,用来记录该块所有发生的事务,一个itl可以看作是一条事务记录.当然,如果这个事务已经提交,那么这个itl的位置就可以被反复使用了,因为itl类似记录,所以,有的时候也叫itl槽位.如果一个事务一直没有提交,那么,这个事务将一直占用一个itl槽位,itl里面记录了事务信息,回