四、存储结构

 

总体来说oracle的逻辑结构和物理结构是由块、区、段、表空间、数据文件、控制文件、重做日志文件组成,我们来看看他们的基本特性。

 

1.    

块是oracle管理存储空间的最小单元,一个块是由整数倍个操作系统块组成,假如我们是NTFS的硬盘分区格式,操作系统最小块为4K,那么我们的oracle的块就可能是4K8K12K等等,具体大小是由初始化参数DB_BLOCK_SIZE来确定的,不过这个参数是在安装oracle时确定的,一旦安装好oracle后即无法修改。

 

相对于块来说主要的操作参数有pctfree,pctused

a)Pctfree用于指定快中必须保留的最小空闲空间比列,如果你的表经常进行update操作的话,需要将空闲比列调大一点,因为update操作会消耗掉空闲空间,当一个块中的空闲空间因为太小而不够update操作消耗的话,系统就会增加新块,从而形成记录链接现象影响表的I/O功能。

b)pctused用于制定一个百分比,当块中已经使用的存储空间降低到这个百分比之下时,这个块材被重新标记为可用。这个参数是和pctfree配合使用的,pctused越大越有利于insert,pctfree越大越有利于update。当然这两个参数加起来不能超过100

让我们看看这两个参数在OEM的哪里如图:
or42.gif

上图的:保留用于更新的空闲空间的百分比<->pctfree,行插入被选对象的使用空间闸值的百分比<->pctused

1.    

区比块高一级,是由一系列连续的块组成。Oracle在进行存储空间分配、回收和管理时都是以区为基本单位的。注意这里只有连续的块才能被“装备”成一个区。

  区里主要的参数是initial,next,pctincrease

or43.gif

上图:初始大小<->initial,下一个大小<-> next,增量<-> pctincrease

具体含义很明确吧。

如上图,oracle首先将分配一个64K的初始区,满了之后再分配一个64K的后续区,满了就再分配第二个96K(64K+64K*50%)的后续区,再满了就分配144K(96K+96K*50%)的后续区,依次类推吧。

当然你也可以修改这些参数,不过参数修改之后,新的分配方式只有在以后为对象分配新的区时才会生效。

    上图的STORAGE这个关键词就是显式分区语句。通过在create table附加storage语法就能创建分区表。

1.    

段是比区更高一级的逻辑存储结构,段由多个区组成。这些区可以是连续的,也可以是不连续的。当用户在数据库中创建各种具有实际存储结构的对象时oracle就将为这些实际对象(表、索引)创建段,这些对象将全部保存在其段中,一般情况下一个对象只会有一个段。上两节的两张图其实就是段的管理界面。在上面的图中我们可以设置PCTFREE,PCTUSED,INIRANS,INITIAL,NEXT,PCTINCREASE等参数。

可以看出到段这一级就已经和存储空间没多大关系了,段已经是独立的逻辑存储结构了。也就是说,当一个表的分配空间不够的时候,oracle就为这个段再添加一个或多个区以存储数据。以上的工作机理和mysql有点相似,和sql server就不太一样了。

简单的说oracle里的段有4种类型:

l         数据段

l         索引段

l         临时段

l         回退段

a.数据段:存放数据的段,oracle中所有未分区的表都使用一个段来保存数据,而分区的表将为每个分区建立一个独立的数据段。

 

b.索引段:存放索引条目的段,oracle中所有未分区的索引都使用一个段来保存数据,而分区的索引将为每个分区建立一个独立的数据段。

 

c.临时段:放临时数据的段。最好不要在SYSTEM表空间中存放临时段,以避免产生碎片。

 

d.回退段:保存回退条目,oracle将被修改的数据的初始化版本保存在回退条目中,利用这些信息,用户可使用撤销未提交的事务的方式来恢复崩溃的实例,也就是roll back啦。当然关于回退段展开讲的话可能会很深,这里就不多说了。而且回退段的概念在以后的oracle版本中可能会弃用。

 

2.     表空间

表空间是最高一级的逻辑存储结构,oracle就是由若干个表空间组成。段就包含在表空间中。同过表空间,oracle就可以将相关的逻辑结构和对象组合在一起。比如我是我们学校的信息中心的DBA,那我就会将教务处,科研处,系办,后勤处等等分别创建成不同的表空间分别放在不同的硬盘上,这样可以避免I\O冲突和碎片。

 

对于表空间而言,除了普通的表空间外,oracle还有3个特殊的表空间

l         SYSTEM表空间

l         撤销表空间

l         临时表空间

 

a.SYSTEM表空间:

   SYSTEM表空间中存放着数据字典、PL\SQL程序的源代码和解析代码、数据库对象(视图、序列等等)的定义。

   数据字典:是一组保存数据库自身信息的内部系统表和视图(这个概念细讲起来那叫个难啊,我在上课的时候反正不管怎么讲,学生就是听不懂!结果讲啊讲啊我自己都能给绕进去,反正对于初学者来说如果C语言是佛学的话,那麽数据库(纯理论的)就是道教,玄!)。

 

b.撤销表空间:这个东西和事务有关系,也就是我们上面讲的rollback,只不过假如我们使用撤销表空间而不用回退段的话,我们就不需要显式的去控制回退段,我们只需要建立一个撤销表空间或者使用oracle默认的撤销表空间,然后,呵呵,让一切可怕的后果让oracle自己来扛吧。关于rollback这个策略,oraclesql server比较像,而mysql则还是原始的回退段,唉,毕竟是不花钱的玩意。

 

c.临时表空间:放临时数据的,最好为每个数据库用户都指定一个公用的临时表空间,如果不指定这这些临时数据就都会放在SYSTEM表空间中,从而产生大量的碎片。

可以在create table时通过default temporary tablespace  子句来指定临时表空间。

当然你如果已经创建了数据库也可以通过以下语法去添加:

CREATE TABLESPACE demo_mv

DATAFILE 'demo_mv.dbf' SIZE 10M AUTOEXTEND ON//创建表空间

EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

 

CREATE TEMPORARY TABLESPACE temp_mv

TEMPFILE 'temp_mv.dbf' SIZE 5M AUTOEXTEND ON;//demo_mv指定temp_mv临时表空间

 

d.表空间的存储管理方式

  oracle表空间存储管理方式其实是针对段设置的,我们除了可以在段级设置这些参数外(上两张图的界面),还可以在表级统一设置这些参数。当然这里又涉及到一个新的概念:字典管理方式表空间和本地管理方式表空间。

   字典管理方式:表空间使用数据字典来管理存储空间的分配。Sql server,mysql就是这种方式。

   本地管理方式:区的分配与管理信息都存放在表空间的数据文件中,与数据字典无关。

   总体说来两种方式没有什么谁优谁劣之分。

下面是使用字典管理方式的例子:

CREATE TABLESPACE  demo_mv  //创建demo_mv表空间

STORAGE ( INITIAL 64K NEXT 128K PCTINCREASE 50)//初始区64K,后续区128K,增量50%

EXTENT MANAGEMENT DICTIONARY;//使用字典管理方式

 

 

 

下面是使用本地管理方式的例子:

CREATE TABLESPACE  demo_mv  //创建demo_mv表空间

DATAFILE 'demo_mv.dbf' SIZE 10M AUTOEXTEND ON

EXTENT MANAGEMENT LOCAL AUTOALLOCATE;//使用本地管理方式,AUTOALLOCATE数据库自动分配

CREATE TABLESPACE  demo_mv  //创建demo_mv表空间

DATAFILE 'demo_mv.dbf' SIZE 10M AUTOEXTEND ON

EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;//使用本地管理方式,UNIFORM指所有区都一样大128K

 

  上面将的块、区、段、表都是oracle的逻辑存储结构,下面见的数据文件、控制文件、重做日志文件都是oracle的物理存储结构。

 

5.数据文件

    放数据的文件,主要由dbf文件组成。

6.控制文件

控制文件中记录着整个数据库的结构、每个数据文件的状况、系统SCN、检查点计数器等重要信息,在创建数据库时会让用户指定多个位置来存放控制文件,他们之间互为镜像,当其中任何一个发生故障,只需将其从ini文件中注释掉故障数据文件就可重新将数据启动。所以说它很重要。如果所有的文件全部毁坏了,那么就只能使用create controlfile来重新生成控制文件,其主要由CTL文件组成。

7.重做日志文件

  重做日志文件也称事务日志,在重做日志文件中存储着用户对数据库所进行的修改操作。这些文件是用来恢复数据库用的。

  总体说来oracle的物理物理存储结构和Mysql相似,和sql server就相差的有点远了。

posted on 2006-07-25 20:30  coffeeliu  阅读(3452)  评论(2编辑  收藏  举报