oracle的内存结构和存储结构

表空间

当一个用户被创建以后,随之就要为用户分配数据存储的空间,这在oracle中成为“表空间”(Tablespace). 在数据库中创建用户时,基于应用性能和管理的考虑,最好为不同的用户创建独立的表空间。 用于存储永久数据的表空间通常被称为永久表空间,用于存储临时数据的表空间通常被称为临时表空间

逻辑上看,数据块是oracle的最小IO单元,即写入读出内存是以oracle中的块为单位的,oracle中的块通常由多个操作系统的块组成(操作系统的块应该就是该操作系统上文件系统的块,一个操作系统的块由若干磁盘的块组成)。多个oracle的块组成区间,区间是oracle创建对象的最小空间分配单位,。多个分区组成段,段存在于表空间中,因此,表空间可以被看作一个容纳各种对象段(表段,索引段等)的容器。 表空间作为数据库中的逻辑存储单元,可以包含一个或者多个物理文件,因此,表空间也可以被看成文件组。oracle数据库就是由一系列的表空间组成。

表空间的管理,表空间的管理实际上是针对于区间的管理,分成两种,字典管理表空间技术,即,当创建或者删除对象时,Oracle的空间分配和回收是通过数据库中的数据字典表来记录和管理的,这种技术主要在8i以前; 字典管理技术存在很多碎片,严重影响数据库的性能。8i以后,采用的是本地管理表空间技术,即不再使用数据字典来记录Oracle表空间里面的使用情况,而是在每个表空间的数据文件的头部加入了一个位图区域,在其中记录每个区间的使用状况(数据文件还有空区间??---数据文件对应一张表,一个表可以包含若干个段,一个段有若干个区间,所以每个数据文件有若干个区间)。

System表空间是Oracle数据库最重要的表空间,在创建数据库时被最先创建,其中包含了数据库的元数据。

在10g开始,Oracle推出了大文件表空间BigFile和小文件表空间SmallFile。大文件表空间只能包含一个文件,但是文件最大可以达到4GB个数据块的大小,按照Oracle通常支持的不同数据块的大小(2kb,4kb,8,16,32kb), 大文件表空间的大小可以支持到8TB---128TB.

段空间

在oracle数据库内部,对象空间是以段的形式存在和管理的。段和表对应,当一个段被创建的时候,区间就分配给段,段的存储空间不足,还可以以区为单位不断扩展。在Oracle的存储管理中,以区间为单位分配给段,在段内的时候,是以oracle的块为单位进行使用和管理。在9i以前,段空间采取的是手工段空间管理方式,即有一个freelist记录可用的块,(当一个块的空间使用率达到80%,将不会再增加数据,剩下的20%用于行更新带来的空间扩展需求;当一个块的空间使用率低于40%,才能放入freelist中,可以继续放入数据)。采用freelist的方式,会出现freelist称为瓶颈(多个事务并发请求段头空间freelist自由表时),即使增加为多个freelist,也只是缓解,;所以在9i后,oracle推出了自动段空间管理方式,将自由表freelist用位图取代,去除了块从freelist的删除和添加,所有的块全部放在位图中,不再“满-删除,空加入”的机制,块的使用率显示在位图的状态(集中状态)中。并且如果位图可以支持二级,多级的位图架构。

 

在11g前,当创建一个实体对象时,比如表,数据库就为该对象创建段,为段分配空间,但是,这种状态在有些只创建表,不插入数据的情景下,会造成空间的浪费,所以在11g的时候,引入了延迟段空间创建技术,即:当创建对象时,只存储数据结构定义,并不创建数据段,直到有第一行记录插入时才动态创建分配段空间。这样就可以省去,数据库系统初始化时因创建大量表而消耗的时间和空间。

 

(手动段管理)高水位标记HWM, 一个段分成三部分,header block,used block(row data),unused block其中used block和unused block之间的分界线就是高水位标记HWM,当进行全表扫描的时候,会扫描到HWM下的所有数据块,即使used block中很多数据被删除了,全表扫描还是以HWM为准。当插入insert时,freelist中没有空闲块,HWM会向上移动,但是只会向上移动,不会自动收缩,即使delete大量数据,导致HWM下有很多空闲块。 

(自动段管理)低高水位LHWM和高高水位HHWM, LHWM下都是格式化的块,HHWM上都是未格式化的块,两者之间可能格式化的块和未格式化的块同时存在,全表扫描的时候,会将HHWM下的所有块都扫描完。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。