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.如果空间不够,并且不能为将要插入的新纪录分配额外的空间,那么不要使用簇
oracle聚簇表的理解 (转自:https://blog.csdn.net/gumengkai/article/details/51009345 )的更多相关文章
- myeclipse通过数据表生成jpa或hibernate实体---https://blog.csdn.net/partner4java/article/details/8560289
myeclipse通过数据表生成jpa或hibernate实体-----https://blog.csdn.net/partner4java/article/details/8560289
- golang语言并发与并行——goroutine和channel的详细理解(一) 转发自https://blog.csdn.net/skh2015java/article/details/60330785
如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人. Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据. ...
- 系统虚拟内存的理解 转载自http://blog.csdn.net/do2jiang/article/details/4690967
在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制. 一 早期的内存分配机制 在 早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序 ...
- 如何简单地理解Python中的if __name__ == '__main__'(https://blog.csdn.net/yjk13703623757/article/details/77918633)
1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '_ ...
- 使用Mybatis进行连表查询、left join---https://blog.csdn.net/jinzhencs/article/details/51980518
使用Mybatis进行连表查询.left join https://blog.csdn.net/jinzhencs/article/details/51980518
- 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. 当一个进程访问需 ...
- Redis中为什么使用跳表---------转自http://blog.csdn.net/u010412301/article/details/64923131
最近在研究数据库的一些底层实现,百度的面试官问到了跳表,当时没有回答上来,在csdn上看到了这篇文章,感觉写的比较好,希望大家可以多多交流. Redis里面使用skiplist是为了实现sorted ...
- MySQL的表分区详解 - 查看分区数据量,查看全库数据量----转http://blog.csdn.net/xj626852095/article/details/51245844
查看分区数据量,查看全库数据量 USE information_schema; SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PAR ...
- oracle的散列聚簇表
在簇表中,Oracle使用存储在索引中的键值来定位表中的行, 而在散列聚簇表中,使用了散列函数代替了簇索引,先通过内部函数或者自定义的函数进行散列计算,然后再将计算得到的码值用于定位表中的行. 创建散 ...
随机推荐
- link快捷方式
ln -s 源文件 newfile -软连接 ln 源文件 newfile 硬链接 源文件删除之后仍然可以使用
- 归并排序——Java实现
一.排序思想 将两个或两个以上的一排序文件合并成一个有序文件的过程叫归并,而归并排序就是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用.将以有序的了序列合并,得到完全有序 ...
- jqueryUI学习
01.选项卡 拖动按钮<div id="tabs"> <ul> <li><a href="#tabs-1">第一 ...
- ATL模板库中的OLEDB与ADO
上次将OLEDB的所有内容基本上都说完了,从之前的示例上来看OLEDB中有许多变量的定义,什么结果集对象.session对象.命令对象,还有各种缓冲等等,总体上来说直接使用OLEDB写程序很麻烦,用很 ...
- stark——pop功能(admin中添加功能)
一.pop功能需要实现的功能和问题 1.如何在一对多和多对多字段后渲染 +2.+对应的跳转路径是什么3.保存添加记录同时,将原页面的对应的下拉菜单中添加该记录 二.window.open()方法详解 ...
- vue——组件
一.组件概念 vue的核心基础就是组件的使用,玩好了组件才能将前面学的基础更好的运用起来.组件的使用更使我们的项目解耦合.更加符合vue的设计思想MVVM. // 定义一个名为 button-coun ...
- javascript12个你必须掌握的技能
网站建设的时候,作为码农,总喜欢写一些高效且省事的代码,这里,dbestech为你提供关于JavaScript的使用技巧点. 1. 空(null, undefined)验证 当我们创建了一个新的变量, ...
- 微信小程序--阻止冒泡事件
微信小程序事件的使用方式 在组件中绑定一个事件处理函数. 如bindtap,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数. <view id="tapTest ...
- 刚在虚拟机上装的Linux系统,ifconfig后IP地址怎么成了127.0.0.1了
之前在虚拟机上装了Linux系统,用了一段时间后想删除了重新装一下,然而装完以后ifconfig后,出现的是 [root@localhost ~]# ifconfig lo Link encap:Lo ...
- DrawerLayout侧滑
DrawerLayout是Support Library包中实现了侧滑菜单效果的控件,可以说DrawerLayout是因为第三方控件如SlidingMenu等出现之后,google借鉴而出现的产物.D ...