当前位置: 首页 > news >正文

Oracle浅谈之逻辑体系第一回

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    这里是数据文件存放数据之处,也是数据库存在的根本。不过这样的数据文件让我们使用者感觉无从下手了解,好像黑盒子一样。但是只要正确认识和剖析Oracle的体系逻辑结构,就可以让我们进一步加深对Oracle数据库的了解,不在是停留在黑盒子的认识水平,从而工作起来游刃有余。

    这里要隆正介绍的体系逻辑结构是:表空间(TABLESPACE)、段(SEGMENT)、区(EXTENT)、块(BLOCK)。ORACLE SERVER正是条理地通过表空间以及段、区、块控制磁盘空间的合理高效的使用,观察一下图:

    从图中我们不难看出,数据库(DATABASE)由若干个表空间(TABLESPACE)组成,表空间由若干个段(SEGMENT)组成,段由若干个区(EXTENT)组成,区又是由Oracle的最小单元块(BLOCK)组成。

    其中表空间又包含系统表空间、回滚段表空间、临时表空间、用户表空间。除了用户表空间外其他三种表空间有各自特定的用途,不可随意更改和破坏,尤其是系统表空间更是需要谨慎的保护。

    从小到大来说,一系列连续的BLOCK组成了EXTENT,一个或多个EXTENT组成了SEGMENT,一个或多个SEGMENT组成了TABLESPACE,而一个或多个TABLESPACE组成了DATABASE(一个DATABASW要想存在,至少需要哟SYSTEM及UNDO表空间)。

    我们新建的表其实是和段(SEGMENT)直接对应,其中T表就是T段,T2表就是T2段,T3表就是T3段(不过要注意,其实表并不是只对应一个段,如表中包含LOB类型列,则LOB至少会有两个段,数据段和索引段,如表有分区,则每个分区又都独立成段)。

    如果建表的命令如下:

    create table t1(id int) tablespace tbs_text;

    create table t2(id int) tablespace tbs_text;

    create table t3(id int) tablespace tbs_text;

那显而易见t1段,t2段,t3段都属于 tbs_text表空间。

    假如一个区有固定是由10个数据块组成的,我们插入t表的动作就是这样的:

        数据插入某个区EXTENT1的第1个数据块中,很快就插满了,然后就插入第2个同属于该EXTENT1区的数据块中,接下来第2个又插满了,插第三个...当准备插入第11个数据块的时候,这个区满了。接下来只好插入EXTENT2区,直至插完EXTENT3、EXTENT4后,而这些EXTENT1、EXTENT2、EXTENT3、EXTENT4组成了T段,也就是T表。

    Oracle的这个EXTENT的设计师为了避免过度扩展,因为块的尺寸太小了,如果以块的尺寸为单位进行扩展,Oracle数据库的运行就会变得很慢。

下面我从Oracle逻辑结构的最小单位数据块BLOCK说起:

    虽然说BLOCK是Oracle的最小逻辑数据单位,但是所有数据在文件系统层面的最小物理存储单位是字节,操作系统也有一个类似Oracle的块容量的参数(block size),但是Oracle总是访问整个Oracle BLOCK,而不是按照操作系统的 block size来访问的。

    一般情况下大多数操作系统OS的块容量为512字节大小或其整数倍,而数据库块一般默认设置为8KB,除此之外也有系统将其设置为2KB、4KB、16KB、32KB、64KB等其他大小,但是数据库的BLOCK一般要设置为操作系统OS块容量的整数倍,这样可以减少IO操作。

    Oracle的数据库块并不是简单地往里插数据,插满了装不下就插入到另一个数据块这么简单,而是额外提供了一定的管理功能。数据块的组成分为数据块头(包含标准内容和可变内容)、表目录区(table directory)、行目录区(row directory)、可用空间区(free space)、行数据区(row data)、这5个部分,具体如图:

 

数据块分成了5个部分:

    1. 数据块头(header)中包含了此数据块的概要信息,例如块地址(block address)及数据块所属的段的类型(比如到底是表还是索引).

    2. 表目录存放了什么呢?只要有一行数据插入到数据库块中,那该行数据所在的表的信息被存储在这个区域。

    3. 行目录存放什么呢?其实就是存放你插入的行的地址。

    4. 可用空间区说来就简单了,就是块中的空余空间,为什么要有空余呢?这个空余的多少由Oracle的pctfree参数设置,如果是10,该块将会空余10%左右的空间。此外如果是表或者索引块,该区域还会存储事务条目,大致有23字节左右开销。

    5. 而行数据区域就更简单了,就是存储具体的行的信息或者索引的信息,这部分占据了数据块绝大部分的空间。

这里数据块头、表目录区、行目录区被统称为管理开销,其中有些开销的容量是固定的,而有些开销的总容量是可变的,数据块中固定及可变管理开销的容量平均在84到107字节之间。

    我们把一些连续的数据块组合在一起,就形成了区(EXTENT),Oracle中这个被称之为EXTENT的数据库逻辑存储分配单位就是这么形成的。

    EXTENT是Oracle数据库分配空间的最小单位,请注意分配这两个字眼。

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/hcy8888/blog/903072

相关文章:

  • 迁移TFS2008后,项目门户网站及Team Explorer的报表均无法正常显示的原因
  • Word编辑故障经典问答
  • java 是否输出是整数
  • 项目实践中Linux集群的总结和思考
  • Android开发之策略模式初探
  • android 2.3 StrictMode 使用
  • 前端之本http协议
  • 浙江省委组织部长蔡奇做客腾讯:我是微博控
  • SEO优化方案及SEO流程表
  • SpriteKit 技巧之添加背景图片
  • 实验九 三层交换机配置路由DHCP中继(二)
  • ILMerge合并多个DLL
  • htmlunit爬取js异步加载后的页面
  • ruby gem 0.9.4的问题
  • Innodb与Myisam引擎的区别与应用场景
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • HTTP--网络协议分层,http历史(二)
  • IDEA 插件开发入门教程
  • JAVA之继承和多态
  • Shadow DOM 内部构造及如何构建独立组件
  • HanLP分词命名实体提取详解
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (13)Hive调优——动态分区导致的小文件问题
  • (C语言)字符分类函数
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (转)程序员疫苗:代码注入
  • (转)项目管理杂谈-我所期望的新人
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .net反编译工具
  • .NET企业级应用架构设计系列之结尾篇
  • .net与java建立WebService再互相调用
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .NET中的Exception处理(C#)
  • /bin/rm: 参数列表过长"的解决办法
  • :=
  • @Bean, @Component, @Configuration简析
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ 数据结构 - C++]红黑树RBTree
  • [.net] 如何在mail的加入正文显示图片
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [AR Foundation] 人脸检测的流程
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C#C++]类CLASS
  • [C++参考]拷贝构造函数的参数必须是引用类型
  • [Linux_IMX6ULL驱动开发]-基础驱动