下面咱们就具体了解一下Oracle的逻辑结构和物理结构:
一、Oracle逻辑结构
其他关系的逻辑结构,我感觉都是抽象的,但是,Oracle的逻辑结构不抽象,它是一种层次结构,主要由:表空间(Tablespace),段(segment),区(extents)和数据块(blocks)等概念组成,具体如下图所示:
1.1数据块
数据块是Oracle最小的存储单位,Oracle的数据放在数据块中,但是此”数据块“非操作系统的”系统块“,这两个要区分开,一般Oracle数据块的大小是操作系统系统块的整数倍。Oracle每次请求数据的时候,都是以数据块为单位,也就是说,每次请求的数据是块的整数倍,如果请求的数据量不到一块,那么Oracle也会读取整个数据块。
数据块大小是由初始化参数DB_BLOCK_SIZE指定的,符合标准的就是标准块,不符合标准的就是不标准块
SYS@ zxy>col name for a20
SYS@ zxy>col value for a10
SYS@ zxy>select name,value from v$parameter where name='db_block_size';
NAME VALUE
-------------------- ----------
db_block_size 8192
SYS@ zxy>
一般情况下:Oracle默认都是8192B,而操作系统的系统块是2048B,Oracle的数据块是由4个操作系统块构成。
数据块中存放数据、索引数据和簇数据等,无论存放那种数据,其结构都是一样的,都是由块头、表目录、行目录、空余空间(又叫做自由空间)、行数据等5部分组成,如下图所示:
数据块中各个组成部分介绍如下:
通常把块头、表目录、行目录这三部分组合起来成为头部信息区,头部信息区不存放数据,它存放整个块的引导信息,起到引导系统读取数据的作用,如果头部信息区遭到破坏,则oracle系统无法读取这部分数据。空余空间和行数据用于存储真正的数据。
补充:空余空间,这部分非常重要,经常所说的行链接和行迁移就发生在此:无论是行链接还是行迁移,都会影响数据库的性能。Oracle在读取这样的记录的时候,Oracle会扫描多个数据块,执行更多的I/O。
当往数据库中插入(INSERT)数据的时候,块中的自由空间会减少,当对块中已经存在的行进行修改(UPDATE)的时候(使记录长度增加),块中的自由空间也会减少。DELETE语句和UPDATE语句会使块中的自由空间增加。当使用DELETE语句删除块中的记录或者使用UPDATE语句把列的值更改成一个更小值的时候,Oracle会释放出一部分自由空间。释放出的自由空间并不一定是连续的。通常情况下,Oracle不会对块中不连续的自由空间进行合并。因为合并数据块中不连续的自由空间会影响数据库的性能。只有当用户进行数据插入(INSERT)或者更新(UPDATE)操作,却找不到连续的自由空间的时候,Oracle才会主动的合并数据块中不连续的自由空间。
行链接和行迁移(Row Chaining and Migrating)
对于块中的自由空间,Oracle提供两种管理方式:自动管理,手动管理
自动管理:Oracle使用位图(bitmap)来管理和跟踪数据块,这种块的空间管理方式叫“自动管理”。自动管理有下面的好处:
手动管理:用户可以通过PCTFREE, PCTUSED来调整块中空间的使用,这种管理方式叫手动管理。相对于自动管理,手动管理方式比较麻烦,不容易掌握,容易造成块中空间的浪费。
PCTUSED也是用于设置一个百分比,当块中已使用的空间的比例小于这个百分比的时候,这个块才被标识为有效状态。只有有效的块才被允许插入数据。
PCTFREE参数用于指定块中必须保留的最小空闲空间百分例,默认值为10。之所以要预留这样的空间,是因为UPDATE时,需要这些空间。如果UPDATE时,没有空余空间,Oracle就会分配一个新的块,这会产生行迁移(Row Migrating)。
简单来说:
pctused表示数据所占最低百分比,如果达到pctused时不能插入数据,delete后如果达到pctused才可以用来insert。
pctfree表示用于保留更新操作的百分比,如果超过该值就不能插入数据。
例如,假定在Create table语句中指定了pctfree为20,则说明在该表的数据段内每个数据块的20%被作为可利用的空闲空间,用于更新已在数据块内存在的数据行其余80%是用于插入新的数据行,直到达到80%为止。显然,pctfree值越小,则为现存行更新所预留的空间越少。因此,如果pctfree设置得太高,则在全表扫描期间增加I/O,浪费磁盘空间;如果pctfree设置得太低,则会导致行迁移。
pctused参数设置了数据块是否是空闲的界限。当数据块的使用空间低于pctused的值时,此数据块标志为空闲,该空闲空间仅用于插入新的行。如果数据块已经达到了由pctused所确定的上边界时,Oracle就认为此数据块已经无法再插入新的行。例如,假定在Create table语句中指定pctused为40,则当小于或等于39时,该数据块才是可用的。所以,可将数据块填得更满,这样可节省空间,但却增加了处理开销,因为数据块的空闲空间总是要被更新的行占据,所以对数据块需要频繁地进行重新组织。比较低的pctused增加了数据库的空闲空间,但减少了更新操作的处理开销。所以,如果pctused设置过高,则会降低磁盘的利用率导致行迁移;若pctused设置过低,则浪费磁盘空间,增加全表扫描时的I/O输出。pctused是与pctfree相对的参数。
那么,如何选择pctfree和pctused的值呢?有个公式可供参考。显然,pctfree和pctused的之和不能超过100。若两者之和低于100,则空间的利用与系统的I/O之间的最佳平衡点是:pctfree与pctused之和等于100%减去一行的大小占块空间大小的百分比。例如,如果块大小为2048字节,则它需要100个字节的开销,而行大小是390字节(为可用块的20%)。为了充分利用空间,pctfree与pctused之和最好为80%。
那么,怎样确定数据块大小呢?有两个因素需要考虑:
一是数据库环境类型。例如,是DSS环境还是OLTP环境?在数据仓库环境(OLAP或DSS)下,用户需要进行许多运行时间很长的查询,所以应当使用大的数据块。在OLTP系统中,用户处理大量的小型事务,采用较小数据块能够获得更好的效果。
二是SGA的大小。数据库缓冲区的大小由数据块大小和初始化文件的db_block_buffers参数决定。最好设为操作系统I/O的整数倍。
1.2 数据区(extent)
数据区是一组连续的数据块。当一个表、回滚段或临时段创建或需要附加空间时,系统总是为之分配一个新的数据区。一个数据区不能跨越多个文件,因为它包含连续的数据块。使用区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位。在Oracle数据库中,分配空间就是以数据区为单位的。一个Oracle对象包含至少一个数据区。设置一个表或索引的存储参数包含设置它的数据区大小。
1.3 数据段(segment)
段是由多个数据区构成的,它是为特定的数据库对象(如表段、索引段、回滚段、临时段)分配的一系列数据区。段内包含的数据区可以不连续,并且可以跨越多个文件。使用段的目的是用来保存特定对象。
一个Oracle数据库有4种类型的段:
1.4 表空间(tablespace)
任何数据库对象在存储时都必须存储在某个表空间中。表空间对应于若干个磁盘文件,即表空间是由一个或多个磁盘文件构成的。表空间相当于操作系统中的文件夹,也是数据库逻辑结构与物理文件之间的一个映射。每个数据库至少有一个表空间(system tablespace),表空间的大小等于所有从属于它的数据文件大小的总和。下面说几个数据库不可获缺的表空间:
OK,以上内容为Oracle的逻辑结构,下面就是Oracle的物理结构啦!
二、物理结构
物理结构包含了数据文件、日志文件和控制文件
数据库名、数据库数据文件、日志文件的名字和位置、数据库建立日期。为了安全起见,允许控制文件被镜象。每一次ORACLE数据库的实例启动时,它的控制文件用于标识数据库和日志文件,当着手数据库操作时它们必须被打开。当数据库的物理组成更改时,ORACLE自动更改该数据库的控制文件。数据恢复时,也要使用控制文件。
参数文件:除了构成Oracle数据库物理结构的三类主要文件外,Oracle数据库还具有另外一种重要的文件:参数文件。参数文件记录了Oracle数据库的基本参数信息,主要包括数据库名、控制文件所在路径、进程等