一、序言
所谓的存储架构,这里指的就是Oracle数据库磁盘空间组织、管理和使用相关的逻辑设计以及实现等方面,更具提的来说就就是讲Oracle数据库是如何组织、分配、管理和使用磁盘件内的存储空间的。这节主要讲述数据文件相关的设计和实现等内容,这也是Oracle存储层面的核心原理和机制
二、详细分析
1、块(Block)
1)块的概念:块是Oracle数据库的读写的最小单位,块的大小是操作系统层面大小的整数倍。数据库中的这个值是可以设置的,可以是2KB、4KB、8KB、16KB和32KB。
2)块自由空间(Free Space):块内的自由空间与行迁移(Row Migrating)以及行链接(Row Chaining)相关。
3)行迁移:当数据行长度因为update操作而增长,块内的自由空间不足以容纳修改之后的数据行,那么该数据行将会迁移到另外一个能够容纳它的块里面存储,原来的块里面留下的是一个指向新存储位置的指针。
(行迁移示意图)
图解执行过程描述:数据行rowk原来在块block1上面的,后来因为update数据行rowk导致长度变大,导致该块内的因为自由空间太小,不足以容纳修改之后的数据行rowk,因此数据行rowk迁移到了块block2上面,在block1中留下了row3的新地址,当需要访问block1获取rowk的新地址,然后再去访问block2,获取真实的rowk,因为发生了行迁移导致多读取了一个块。
我们可以通过增大块中的自由空间大小来避免和减少行迁移。
4)行链接:当当个块的全部空间不足以容纳单个数据行时就会需要多个块链接起来,共同存储这个数据行,行链接的阻止结构如图所示
(行链接示意图)
图解说明:因为block3的全部空间不足以容纳单个数据行row1,因此,在将块block3填满之后,将数据行row1未能够
存储在块block3中的剩余部分,存储到block4中,块block3中保存的只是row1的一部分内容。
虽然在块大小和行大小固定的条件下,行链接避免不了,但是我们可以调整块的大小或者行大小来尽量避免和减少行链接。
5)行迁移和行链接的影响:数据库中存在过很多的行迁移和行链接,都会因为消耗太多的I/O资源而影响性能。
2、区间(Extent)
1)区间的概念:可以译作扩展,区间时Oracle有关存储空间的一个逻辑单位,是由多个地址链接的块组成的。也是Oracle存储空间分配的最小单位。当某个数据库对象要存储时,Oracle只要要为其分配一个区间
2)区间的分配:区间在段(Segment)被创建或者段空间扩展时被分配,具体的细节与Oracle有关
3)区间分配管理的方式:随着版本的不同,区间的分配和管理方式也是不同的。一般采用本地管理(Local Management)存储空间的方式,分配方式分为统一(Uniform)和自动管理(Auto)两种方式,前者每个区间的大小固定并且统一,后者由Oracle系统自动调整和确定。此外还有一种分配方式,就是用户(User)分配方式,因为使用时比较繁琐,所以很少被使用。
4)区间释放:一般来说,当段被清除时,区间所占用的存储空间会被释放,以供系统中其他对象使用,否则,即时数据被删除,区间空间也不会被释放,哪怕是普通的截断。虽然不同版本情况不同,但区间占用的存储空间也不会被完全释放。
3、段(Segment)
1)段的概念:实际存储的是数据库中数据对象数据的逻辑结构和单元,段是由一个或者多个区间组成。
2)分区和段:非分区表和非分区索引分别对应一个段,分区表和分区索引的每个分区或者子分区分别对应一个段。
3)段分配:段是存储数据库对象数据的实体,是存放数据的真正逻辑结构和单元,创建一个非分区表和非分区索引,或者分区表和分区索引时,或者向表或者索引中加载数据时,系统就会为它们分配段,用来实际存储这些数据库对象的数据
4)其他段:除了表和索引对应的段外,还有其他类型的段,例如:临时段、回滚段等,虽然都是被称作段,但是其内部的机制是各不相同的,临时段在临时表空间中创建创建和分配,用来存储临时或者中间数据,会馆段在回滚表空间中创建和分配,用来存储重构块前影像所需的反操作向量数据。
4、表空间(Tablespace)
1)表空间概念:Oracle中最大的存储空间相关的逻辑概念和容器,存储系统和yoghurt数据的段都在表空间中被分配。表空间是共享资源而不是私有资源,不同用户或段的数据可以存储到同一张表空间中,也可以存储到不同的表空间。
2)表空间组成:表空间由一个或多个数据文件组成
3)表空间分类:按照存储数据的类型表空间被分为:数据表空间、临时表空间、回滚表空间。顾名思义。数据表空间用来存储系统和用户的数据,临时表空间用来村相互系统和用户的临时数据,回滚表空间用来存储重构块前影像所需的数据。
三、总结
想要明白数据库中的数据是怎么存储的我想是有必要看看该文章的,相信你看过之后会对mysql的数据存储有更一层次的了解。虽然理论性比较强,但是有时间小编会补上去的,用更加白话的语言描述,因为时间问题,也因为自己能力并不能够完全明白其中内容,所以就暂时先这样了。