Oracle 逻辑存储结构逻辑存储结构是Oracle 数据库存储结构的核心内容,对Oracle 数据库的所有操作都会涉及到其逻辑存储结构。
数据库的逻辑结构是从逻辑的角度分析数据库的构成,即创建数据库后形成的逻辑概念之间的关系。
在逻辑上,Oracle 将保存的数据划分为一个个小单元来进行存储和维护,高一级的存储单元由一个或多个低一级的存储单元组成。
Oracle 的逻辑存储单元从小到大依次为:数据块(DA TA BLOCKS )、盘区(EXTENT )、段(SEGMENTS )和表空间(TABLE SPACES ),图2-2显示了各逻辑单位之间的关系。
数据库...表空间表空间段段盘区数据块盘区数据块段段数据库...表空间表空间段段盘区数据块盘区数据块段段图2-2 数据库的逻辑存储组成由图2-2可知,Oracle 数据库由多个表空间组成,而表空间又由许多段组成,段由多个盘区组成,盘区又由多个数据块组成。
1 数据块数据块是Oracle 用来管理存储空间的最小单元,也是执行数据库输入输出操作时的最小单位。
相对应地,操作系统执行输入输出操作的最小单位为一个操作系统块的大小。
在操作系统中,执行I/O 操作是以操作系统块为单位,而在Oracle 中,执行的I/O 操作以Oracle 数据块为单位。
Oracle 块的大小是操作系统块大小的整数倍。
以Windows NT 操作系统为例,NTFS 格式的磁盘分区一般为4KB 大小,因此Oracle 块的大小为8KB 等。
数据块的标准大小由初始化参数DB_BLOCK_SIZE 确定,具有标准大小的块被称为标准块。
Oracle 支持在同一个数据库中使用多种大小的块,与标准块大小不同的块称为非标准块。
可以通过查询V$PARAMETER 数据字典,可以获得参数DB_BLACK_SIZE 的值,该参数值同时也是数据块的尺寸大小。
例如:SQL> select name,value2 from v$parameter where name ='db_block_size';NAME V ALUE--------------------------- --------------------------db_block_size 8192在数据块中可以存储各种类型的数据,如表数据、索引数据、簇数据等。
无论数据块中存放何种类型的数据,块都具有相同的结构,图2-3列出一个Oracle 块的基本结构。
块头部表目录行目录空闲空间行空间图2-3 数据块的结构数据块的各组成部分分别介绍如下:●块头部块头部包含块中一般的属性信息,如块的物理地址、块所属的段的类型(如数据段、索引段、回退段等)。
●表目录如果块中存储的数据是表数据(表中一行或多行记录),则表目录中存储关于该表的相关信息。
●行目录如果块中存储的数据为表数据(表中的一行或多记录),则在行目录中保存这些记录的相关信息。
●空闲空间空闲空间是块中尚未使用的存储空间。
当向数据块中添加新数据时,将减小空闲空间。
●行空间行空间是块中已经使用的存储空间,在行空间中存储了数据库对象的数据。
例如,表中的一行或多行记录。
块头部、表目录和行目录共同组成块的头部信息区。
块的头部信息区中并不存放实际的数据库数据,它只起到引导系统读取数据的作用。
因此,如果头部信息区被损坏,则整个数据块将失效,数据块中存储的数据将丢失。
而空闲空间和行空间则共同构成块的存储区,空闲空间和行空间的总和即是块的总容量。
2 盘区盘区是由一系列物理上连续存放的数据块所构成的Oracle存储结构,由一个或多个数据块组成一个盘区,而一个或多个盘区组成一个段。
当一个段中的所有空间被使用完后,系统将自动为该段分配一个新的盘区。
盘区是Oracle存储分配的最小单位。
在Oracle中创建带有实际存储结构的数据库对象时,Oracle将为对象分配相应的盘区,以构成一个段来提供存储空间。
当段中已经分配的区写满后,Oracle将为段分配一个新的区,以便容纳更多的数据库。
3 段段是由一系列区组成的,它也不再是存储空间的分配单位,而是一个独立的逻辑存储结构。
对于具有独立存储结构的对象,它的数据全部存储在保存它的段中。
一个段只属于一个特定的数据库对象,每当创建一个具有独立段的数据库对象时,Oracle将为它创建一个段。
例如,在Oracle中创建表时会为它分配若干个区,以组成表的数据段。
在Oracle中,不同类型的数据库对象拥有不同类型的段。
根据段中存放的数据库对象类型,可以将段分为几种类型:数据段、索引段、临时段、回退段和LOB段。
1.数据段在数据段中保存的是表中的记录。
当用户创建表的同时,Oracle系统将为表创建数据段。
Oracle中所有未分区的表都使用一个段来保存数据。
当表中的数据增加时,数据段也将变大,数据段的增大过程是通过添加新盘区实现的。
在表空间中创建了多少个表,相应地在该表空间就有同量的数据段,并且数据段的名称与它对应的表名相同。
2.索引段在索引段中保存的是索引中的索引信息。
在使用CREATE INDEX语句创建索引,或者在定义约束是自动创建索引的同时,Oracle将为索引创建它的索引段。
3.临时段当用户执行查询等操作时,Oracle可能会需要使用到一些临时存储空间,用于临时保存解析过的查询语句,以及在排序过程中产生的临时数据。
Oracle会自动在专门用于存储临时数据的表空间为操作分配临时段。
在执行如下几种类型的SQL语句时,Oracle都会在临时表空间中为语句操作分配一个临时段:●CREATE INDEX●SELECT …ORDER BY●SELECT DISTINCT●SELECT ... GROUP BY●SELECT … UNION●SELECT … INTERSECT●SELECT … MINUS如果经常需要执行上面类型的语句,最好调整SORT_AREA_SIZE初始化参数来增大排序区,使排序操作尽量能够在内存中完成,以获得更好的性能。
当操作执行完毕后,为该操作分配的临时段将被释放。
当带有排序的操作十分频繁时,临时段的分配和释放也将十分频繁,因此为了提高性能,Oracle创建了一个独立的临时表空间,并在其中存放临时段,这样可以避免与其他表空间争用存储空间。
4.回退段回退段用于保存回退条目,Oracle将被用户修改前的值保存在回退条目中。
利用这些信息,用户可以撤销未提交的操作,Oracle则可以利用回退段来维护数据库的读写一致性,并能够从实例崩溃中时进行恢复。
在Oracle 11g中,回退也被称为撤销管理,并且不需要为数据库创建多个回退段,也不需要管理回退段,只需要创建一个撤销表空间。
对回退段的管理由Oracle自动完成,这就是自动撤销管理。
5.LOB段如果表中含有如CLOB和BLOB等大对象类型数据时,系统将创建LOB段以存储相应的大型对象数据。
LOB段独立于保存表中其他数据的数据段。
4 表空间表空间是在Oracle中用户可以使用的最大的逻辑存储结构,用户在数据库中建立的所有内容都被存储在表空间中。
Oracle使用表空间将相关的逻辑结构组合在一起,表空间在物理上与数据文件相对应,每一个表空间是由一个或多个数据文件组成的,一个数据文件只可以属于一个表空间,这是逻辑与物理的统一。
所以存储空间在物理上表现为数据文件,而在逻辑上表现为表空间。
数据库管理员可以创建若干个表空间,也可以为表空间增加或删除数据文件。
表空间通过数据文件来扩大,表空间大小等于构成该表空间的所有数据文件大小之和。
由于表空间物理上对应了操作系统的一个或多个数据文件,因此在表空间中创建的对象在物理上可以有如下两种存储方式:●若表空间只对应一个数据文件,该表空间中所有的对象都存储在这个数据文件中。
●若表空间对应于多个数据文件,Oracle可将一个对象存储在该表空间的任意一个数据文件中。
事实上,Oracle可以将同一个对象的数据分布在表空间的多个数据文件中。
在创建数据库时,Oracle会自动创建一些默认的表空间,其中除了用于存储用户数据的普通表空间外,在一个数据库中还会存在三种类型的表空间:SYSTEM表空间、撤销表空间和临时表空间。
这三种表空间的创建、维护与管理都与普通的用户表空间不同,在本节中将分别进行简单介绍。
1.SYSTEM表空间在每一个数据库中,都有一个名为SYSTEM的表空间,即系统表空间。
该表空间是在创建数据库时自动创建的,在SYSTEM表空间中保存有如下信息:●在SYSTEM表空间中存储数据库的数据字典和内部系统表基表。
数据字典是一组保存数据库自身信息的内部系统表和视图。
●在SYSTEM表空间中存储所有PL/SQL程序的源代码和解析代码,包括存储过程、函数、包和触发器等。
在需要保存大量PL/SQL程序的数据库中,应当设置足够大的SYSTEM表空间。
●在SYSTEM表空间中存储数据库对象(如视图、对象类型说明、同义词和序列)的定义。
当在数据库中创建一个新的对象时,对象的实际数据可以存储在其他表空间中,但对象的定义信息切保存在SYSTEM表空间中。
通过使用如下的语句,可以查看数据库中数据字典的信息:select * from dict查看内部系统表的SQL:select * from v$fixed_view_definition数据库管理员DBA对数据库系统中的数据字典必须有一个很深刻的了解,必须准备一些基础的SQL语句,通过这些SQL可以立即了解系统的状况和数据库的状态。
大量的读了操作、少量的写入操作是该表空间的一个显著的特点。
因此SYSTEM表空间对于Oracle数据库而言是至关重要的。
一般在SYSTEM表空间中只应该保存属于SYS模式的对象,即与Oracle自身相关的数据,而用户在对象和数据都应当保存在非SYSTEM表空间中。
另外,在10g和11g中,Oracle新增了表空间SYSAUX,以此作为SYSTEM表空间的辅助表空间,SYSAUX表空间一般不用于存储用户数据,并由Oracle系统内部自动维护。
2.撤销表空间撤销表空间是特殊的表空间,它专门用来在自动撤销管理方式下存储撤销信息,即回退信息。
当数据库进行更新、插入、删除等操作的时候,新的数据被更新到原来的数据文件中,而旧的数据就被放到撤销段中。
如果数据需要回滚,那么可以从撤销段将数据再复制到数据文件中,来完成数据的回退。
在系统恢复的时候,撤销段可以用来撤销没有被提交的数据,解决系统的一致性问题。
除了撤销段外,在撤销表空间中不能建立任何其他类型的段,即任何数据库用户,都不能在撤销表空间中创建数据库对象(如表、索引等)。
在撤销表空间中,存在大量的写入操作,而只有少量的读取操作。
数据库管理员可以为数据库创建多个撤销表空间,但是每个数据库实例最多只能使用一个撤销表空间。