我们先看下面几个我们实际工作中经常会遇到的问题:
1、通常说Oracle数据库是什么?
2、如何理解Oracle实例?
3、Oracle实例由哪些部分组成,它们之间的作用是什么?
4、如何理解Oracle的物理结构?
5、Oracle的物理结构由哪些部分组成,它们之间的作用是什么?
6、如何理解Oracle的逻辑结构?
7、Oracle的逻辑结构由哪些部分组成,它们之间的作用是什么?
数据库在各个行业都会有使用到;其实,我们平时无论是在与客户沟通或者交流中,所说的Oracle数据库是指Oracle数据库服务器(Oracle Server),它由Oracle实例(Oracle Instance)和Oracle数据库(Oracle Database)组成。
Oracle实例:就是用于与数据库进行交互的一片内存区域和后台进程的集合;实例启动时,系统首先在服务器内存中分配系统全局区(System Global Area),构成Oracle内存结构,然后启动必须的常驻内存的操作系统进程,组成Oracle的进程结构,内存结构和进程结构即构成Oracle实例。
Oracle数据库:物理文件的集合,包括数据文件、重做日志文件、控制文件、参数文件、密码文件、归档日志文件、备份文件、告警日志文件、跟踪文件等等;其中数据文件、控制文件、重做日志文件和参数文件是必须的,其他文件可选。
一个实例只能对应/操作一个数据库,一个数据库可以由一个或多个实例操作(比如RAC)。
下图为Oracle实例结构图:
Oracle实例就是用于与数据库进行交互的一片内存区域和后台进程的集合,一个单独的数据库可以被多个实例访问,Oracle早期的并行服务器OPS演变到现在普遍使用RAC集群架构。
实例启动时,系统首先在服务器内存中分配系统全局区(System Global Area),构成Oracle内存结构,然后启动必须的常驻内存的操作系统进程,组成Oracle的进程结构,内存结构和进程结构即构成Oracle实例。实例在操作系统中用ORACLE_SID来标识,在Oracle中用参数实例名(Instance Name)来标识, 它们两个的值是相同的。下面介绍实例的组成和作用:
1、系统全局区(System Global Area)
系统全局区System Global Area(SGA)是系统分配的共享的内存结构,当数据库实例启动时,SGA的内存被自动分配;当数据库实例关闭时,SGA内存被回收;SGA可以包含一个数据库实例的数据或控制信息。当多个用户连接到同一个数据库实例时,在实例的SGA中,数据可以被多个用户共享;SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。SGA主要包括:
1)、共享缓冲区(Shared Pool)
共享池(Shared Pool)就是我们常说的SQL共享池,它还包括库缓冲区(Library Cache)和数据字典缓冲区(Data Dictionary Cache);共享缓冲区大小由参数SHARED_POOL_SIZE设定。
a)、库缓冲区:存储对数据库进行操作的语句信息,包括执行计划及运行数据库的SQL语句的语法分析树,所有用户在第二次运行相同的SQL语句时,可以利用SQL共享池中可用的语法分析信息来加快执行速度;库缓冲区通过最近最少使用(LRU,LeastRecentlyUsed)算法来管理可用空间,当SQL共享池填满时,将从库缓存区中删掉最近最少使用的执行路径和语法分析树,以便为新的条目腾出空间;如果SQL共享池太小,语句将被连续不断地再装入到库缓存区,从而影响操作性能。
b)、数据字典缓冲区(Database Buffer Cache):数据库对象的信息存储在数据字典表中,这些信息包括用户帐号数据、权限、数据文件名、段名、表结构及表说明等,当数据库需要这些信息(如用户对表是否有读写权限)时,将读取数据字典表且将返回的数据存储在字典缓存区中。数据字典缓冲区使用最近最少使用(LRU,LeastRecentlyUsed)算法来管理,数据字典缓存区的大小由数据库内部管理,如果字典缓存区太小,数据库需要反复查询数据字典表以获取访问数据库所需的信息,这些查询由循环调用(recuesivecall)事件完成。
2)、数据库缓冲区(Database Buffer Cache)
数据库缓冲区由DB_CACHE_SIZE参数设定,Oracle使用最近最少使用(LRU,LeastRecentlyUsed)算法来管理数据库缓冲区可用空间;当存储区需要空闲空间时,最近最少使用块将被移出,新数据块将在存储区代替它的位置,通过这种方法,将最频繁使用的数据保存在存储区中;如果SGA的大小不足以容纳所有最常使用的数据,那么,不同的对象将争用数据库缓存区中的空间;当多个应用程序共享同一个SGA时,很有可能发生这种情况。此时,每个应用的最近使用段都将与其他应用的最近使用段争夺SGA中的空间,这样,数据库缓冲区的数据请求将出现较低的命中率,导致系统性能下降。
3)、重做日志缓冲区(Redo Log Buffer Cache)
Redo log包含所有的数据库变化历史,数据库的所有操作变化,均按照写入重做日志缓冲区先于数据块缓冲区、写入重做日志文件先于写入数据文件;当发生提交动作时,将重做日志缓冲区变化刷到重做日志文件。在被写入联机重做日志文件之前,事务首先被记录在称作重做日志缓冲区(Redo Log Buffer)的SGA中,数据库可以周期地分批向联机重做日志文件中写重做项的内容,从而优化这个操作。重做日志缓冲区的大小(以字节为单位)由LOG_BUFFER参数决定。
4)、大池(Large Pool)
大池属于一个可选内存区,如果数据库使用线程服务器选项或频繁执行备份、恢复操作,只要创建一个大池,就可以更有效地管理这些操作。大池将致力于支持大型SQL命令,利用大池,就可以防止这些大型SQL命令争用SQL共享池,从而减少再装入到库缓存区中的语句数量。大池的大小(以字节为单位)由LARGE_POOL_SIZE参数设置,可以使用LARGE_POOL_MIN_ALLOC参数设置大池的最小分配,可以使用SHARED_POOL_RESERVED_SIZE参数为SQL大型语句保留一部分SQL共享池。
5)、Java池(Java Pool)
Java池为Java命令提供语法分析,Java池的大小(以字节为单位)由JAVA_POOL_SIZE参数设置,缺省值为10MB。
6)、多缓冲池
可以在SGA中创建多个缓冲池,能够用多个缓冲池把大数据集与其他的应用程序分开,以减少数据库缓存区内相同资源争用;对于创建的每一个缓冲池,都要设定LRU锁存器的大小和数量,缓冲区的数量必须至少比LRU锁存器的数量多50倍。创建缓冲池时,需要设定保存区(KeepArea)的大小和再循环区(RecycleArea)的大小,与SQL共享池的保留区一样,保存区保持条目,而再循环区则被频繁地再循环使用。使用BUFFER_POOL_KEEP参数规定来保存区的大小。
2、后台进程(Background Process)
数据库实例由内存结构和后台进程,应用与数据库的所有操作和交互都由数据库实例中完成,SGA可以理解为交互平台,后台进程则可以理解为SGA与数据库交互的桥梁。PMON、SMON、DBWRn、LGWRn、CKPT进程为必须的后台进程,ARCHn、LCKn等为可选后台进程。
1)、PMON (Process Monitor,进程监控进程)
PMON用于在用户进程出现故障时进行恢复,清除失效的用户进程,负责清理内存区域和释放该进程所使用的资源,如果会话不正常终止时,PMON负责Rollback未提交的事务,释放资源;同时监控Oracle所有后台进程(Background Process)。PMON有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。PMON进程要重置活动事务表的状态,释放锁,将该故障的进程的ID从活动进程表中移去。PMON还周期地检查调度进程(DISPATCHER)和服务器进程的状态,如果已死,则重新启动(不包括有意删除的进程)。
2)、SMON(System Monitor Process,系统监控进程)
SMON进程在实例启动时,如果有需要则执行实例恢复,在实例恢复过程中,如果由于文件读取错误或所需文件处于脱机状态而导致某些异常终止的事务未被恢复,SMON将在表空间或文件恢复联机状态后再次恢复这些事务。SMON还负责清理不再使用的临时段(temporary segment)以及为数据字典管理的表空间(dictionary managed tablespace)合并相邻的可用数据扩展(extent)。在具有并行服务器选项的环境下(RAC),SMON对有故障CPU或实例进行实例恢复(Instance Recovery)。SMON进程有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。
3)、DBWn (database writer,数据库写入进程)
DBWn进程是负责缓冲存储区管理的一个Oracle后台进程,通过使用最近最少使用(LRU,LeastRecentlyUsed)算法来管理,保持内存中的数据块是最近使用的,使I/O最小,将dirty buffer写入到datafile中,维护数据缓冲区的清理,以使用户进程总能找到足够的空闲缓冲区。DBWn进程用于将数据缓冲的数据写入数据文件,是负责数据缓冲区管理的一个Background Process,默认数量1个,最多10个,由参数为db_writer_processes设置。DBWn进程在以下情况触发:
a)、没有空闲缓冲区(no free buffers)
b)、达到脏缓冲区阀值(dirty buffer threshold reached)
c)、检查点(checkpoint)
d)、表空间offline(tablespace offline)
e)、超时,每次3秒(time out)
f)、drop/truncate表(drop table/truncate table)
4)、LGWR(Log writer,日志写入进程)
LGWR进程将日志缓冲区写入磁盘上的一个日志文件,它是负责管理日志缓冲区的一个Oracle后台进程。LGWR进程同步地写入到活动的镜象在线日志文件组。如果组中一个文件被删除或不可用,LGWR可继续地写入该组的其它文件。日志缓冲区是一个循环缓冲区,当LGWR将日志缓冲区的日志项写入日志文件后,服务器进程可将新的日志项写入到该日志缓冲区。LGWR通常写得很快,可确保日志缓冲区总有空间可写入新的日志项。
Oracle使用快速提交机制,当用户发出Commit语句时,一个Commit记录立即放入日志缓冲区,但相应的数据缓冲区改变是被延迟,直到在更有效时才将它们写入数据文件。当一事务提交时,被赋给一个系统修改号(SCN),它同事务日志项一起记录在日志中。由于SCN记录在日志中,以致在并行服务器选项配置情况下,恢复操作可以同步。有时候当需要更多的日志缓冲区时,LWGR在一个事务提交前就将日志项写出,而这些日志项仅当在以后事务提交后才永久化。LGWR进程管理日志缓冲区,将数据库的更改写入日志文件,以便维护数据的一致性,并为数据丢失后进行恢复提供依据。Oracle通过延迟写日志来优化disk I/O读写,以下4种情况之一Oracle会触发LGWR进程写日志:
a)、当用户进程提交一事务时写入一个提交记录。
b)、每三秒将日志缓冲区输出。
c)、当日志缓冲区的1/3已满时将日志缓冲区输出。
d)、当DBWR将修改缓冲区写入磁盘时则将日志缓冲区输出。
5)、CKPT(CheckPoint,检查点进程)
CKPT进程负责通知DBWRn和LGWRn将脏缓冲区写入磁盘,以及时消除因DBWRn/LGWRn延迟写所造成的数据不一致情况,确保内存中的数据块被规律地写入文件,并对数据库数据库控制文件和数据文件进行更新同步(修改文件时间头部),以记录下当前的数据库结构和状态。检查点(CheckPoint)的作用是及时保证进行延迟写,防止数据库出现不一致情况;及时同步各类数据文件,防止各类数据文件出现不一致情况。LGWR后台进程是将log buffer中的数据写到日志文件的进程,是oracle相当重要的一个后台进程,LGWR进程触发的条件为以下4种情况之一:
a)、每3秒钟;也就是该进程最多休眠3秒钟,休眠时触发rdbms ipc message事件;LGWR将buffer中的数据写到日志文件时,触发log file parallel write事件;
b)、在事务提交时(COMMIT),此时会触发LGWR进程写完后才返回提交成功,在等待LGWR进程写的过程中将触发log file sync事件;
c)、DBWn进程写入数据文件之前;
d)、Redo log Buffer三分之一满时,这个数字是有一个隐含参数_log_io_size控制,该值的默认值是log buffer大小的1/3;该值的最大值为3MB,所以Redo log buffer多于1MB的变化记录时也会触发LGWR进程写;
由于Oracle中LGWR和DBWR工作的不一致,Oracle引入了检查点的概念,用于同步数据库,保证数据库的一致性。在Oracle里面,检查点分为两种:完全检查点和增量检查点。下面我们分别介绍这两种检查点的作用:
a)、完全检查点
在Oracle8i之前,数据库的发生的检查点都是完全检查点,完全检查点会将数据缓冲区里面所有的脏数据块写入相应的数据文件中,并且同步数据文件头和控制文件,保证数据库的一致。完全检查点在8i之后只有在下列两种情况下才会发生:
1)、DBA手工执行alter system checkpoint的命令;
2)、数据库正常shutdown(immediate,transcational,normal)。
由于完全检查点会将所有的脏数据库块写入,巨大的IO往往会影响到数据库的性能。因此Oracle从8i开始引入了增量检查点的概念。
b)、 增量检查点
Oracle从8i开始引入了检查点队列这么一种概念,用于记录数据库里面当前所有的脏数据块的信息,DBWR根据这个队列而将脏数据块写入到数据文件中。检查点队列按时间先后记录着数据库里面脏数据块的信息,里面的条目包含RBA(Redo Block Address,重做日志里面用于标识检查点期间数据块在重做日志里面第一次发生更改的编号)和数据块的数据文件号和块号。在检查点期间不论数据块更改几次,它在检查点队列里面的位置始终保持不变,检查点队列也只会记录它最早的RBA,从而保证最早更改的数据块能够尽快写入。当DBWR将检查点队列里面的脏数据块写入到数据文件后,检查点的位置也要相应地往后移,CKPT每三秒会在控制文件中记录检查点的位置,以表示Instance Recovery时开始恢复的日志条目,这个概念称为检查点的“心跳”(heartbeat)。检查点位置发生变更后,Oracle里面通过4个参数用于控制检查点位置和最后的重做日志条目之间的距离。在这里面需要指出的是,多数人会将这4个参数看作控制增量检查点发生的时间。事实上这是错误的,这4个参数是用于控制检查点队列里面的条目数量,而不是控制检查点的发生。
6)、ARCH(archiver,归档进程)
ARCH进程用于管理归档日志文件,当数据库运行在archivelog模式下时,将循环使用的redo log文件组在被复写覆盖前进行归档备份到其他指定存储设备,为数据丢失后进行数据恢复。当Redo Log日志切换时触发ARCH进程进行日志归档。
7)、RECO(Recovery,恢复进程)
RECO进程是在具有分布式选项时所使用的一个进程,自动地解决在分布式事务中的故障,维持在分布式环境中的数据的一致性。主要工作,就是recover那些两阶段提交的但由于网络或其它原因造成状态为prepared的挂起事务。一个结点RECO后台进程自动地连接到包含有悬而未决的分布式事务的其它数据库中,RECO自动地解决所有的悬而不决的事务。任何相应于已处理的悬而不决的事务的行将从每一个数据库的悬挂事务表中删去。当某些节点反馈yes给事务协调器可以提交时,但事务协调器还未正式发出可以提交的最后指示时,由于网络的原因,这些节点失去了和事务协调节点的联系,此时这些事务就成为了一个in-doubt distributed transaction。此时,RECO就负责定期的联系事务协调器,当联系到时,就会提交或者回滚这些事务了。RECO后台进程仅当在允许分布式事务的系统,而且DISTRIBUTED_TRANSACTIONS参数是大于0时会用到该后台进程。
8)、LCKn(lock,锁进程)
LCKn进程是在具有并行服务器选件环境下使用,用于实例间的封锁,可多至10个进程(LCK0,LCK1……,LCK9)。
9)、Dnnn(dispatcher,调度进程)
Dnnn进程允许用户进程共享有限的服务器进程(SERVER PROCESS)。没有调度进程时,每个用户进程需要一个专用服务进程(DEDICATEDSERVER PROCESS)。对于多线索服务器(MULTI-THREADED SERVER)可支持多个用户进程。如果在系统中具有大量用户,多线索服务器可支持大量用户,尤其在客户_服务器环境中。在一个数据库实例中可建立多个调度进程,对每种网络协议至少建立一个调度进程,数据库管理员根据操作系统中每个进程可连接数目的限制决定启动的调度程序的最优数,在实例运行时可增加或删除调度进程。如果不能将客户应用连接到一调度进程时,网络接收器进程将启动一个专用服务器进程。该网络接收器进程不是Oracle实例的组成部分,它是处理与Oracle有关的网络进程的组成部分。在实例启动时,该网络接收器被打开,为用户连接到Oracle建立一通信路径,然后每一个调度进程把连接请求的调度进程的地址给予它的接收器。当一个用户进程作连接请求时,网络接收器进程分析请求并决定该用户是否可使用一调度进程。如果是,该网络接收器进程返回该调度进程的地址,之后用户进程直接连接到该调度进程。有些用户进程不能调度进程通信(如果使用SQL*NET以前的版本的用户),网络接收器进程不能将此用户连接到一调度进程。在这种情况下,网络接收器建立一个专用服务器进程,建立一种合适的连接。
Oracle物理结构包含了数据文件、重做日志文件、控制文件、参数文件、密码文件、归档日志文件、备份文件、告警日志文件、跟踪文件等等;其中数据文件、控制文件、重做日志文件和参数文件是必须的,其他文件可选。
1、数据文件(Datafiles)
每一个Oracle数据库有一个或多个物理的数据文件(data file),数据文件包含全部数据库数据,逻辑数据库结构(如表、索引、视图、函数)的数据物理地存储在数据库的数据文件中。数据文件中的数据在需要时可以读取并存储在Oracle内存储区中。如用户要存取数据库一表的某些数据,如果请求信息不在数据库的内存存储区内,则从相应的数据文件中读取并存储在内存,当修改或插入新数据时,为了减少磁盘输出的总数,提高性能,不必立刻写入数据文件,数据存储在内存,然后由Oracle后台进程DBWRn决定如何将其写入到相应的数据文件。数据文件有下列特征:
a)、一个数据文件仅与一个数据库联系;
b)、一个表空间(数据库存储的逻辑单位)由一个或多个数据文件组成。
2、日志文件(Redo Log Files)
每一个数据库实例有两组或以上日志文件组,为了防止日志文件本身的故障,每个日志文件组可以有一个或以上日志成员。日志的主要功能是记录对数据所作的修改,用于在出现故障时,如果不能将修改数据永久地写入数据文件,则可利用日志得到该修改,从而保证数据不丢失。日志文件中的信息仅在系统故障或介质故障恢复数据库时使用。任何丢失的数据在下一次数据库打开时,Oracle自动地应用日志文件中的信息来恢复数据库数据文件。Oralce日志文件有联机日志文件和归档日志文件两种,联机日志文件用来循环记录数据库改变的操作系统文件;归档日志文件是为避免联机日志文件重写时丢失重复数据而对联机日志文件所做的备份;Oracle数据库可以选择归档(ARCHIVELOG)或非归档(NOARCHIVELOG)模式。
3、控制文件(Control files)
每一Oracle数据库有一个控制文件(Control File)或同一个控制文件的多个拷贝,它记录数据库的物理结构信息,包括数据库名、数据库数据文件和日志文件的名字和位置、数据库建立日期等。由于控制文件记录数据库的物理结构信息,对数据库运行至关重要,为了安全起见,Oracle建议保存两份以上的控制文件镜像于不同的存储设备。 当Oracle数据库的实例启动时,它的控制文件用于标识数据库和日志文件,当着手数据库操作时它们必须被打开,当数据库的物理组成更改时,Oracle自动更改该数据库的控制文件;当然,在数据恢复时,自然会使用控制文件以确定数据库物理文件的名字和位置。
4、参数文件(Parameter Files)
除了构成Oracle数据库物理结构的三类主要文件外,参数文件也是Oracle数据库较为重要的一种文件结构。参数文件记录了Oracle数据库的基本参数信息,主要包括数据库名、控制文件所在路径、进程等。在Oracle9i之前,都只有pfile一种文本格式的参数文件,在9i之后,新增了服务器二进制参数文件spfile;通过修改pfile以修改数据库参数,必须要求重启数据库后才能生效,通过修改spfile以修改数据库参数时,根据参数类型分为静态参数需要重启和动态参数无需重启立即生效,可以通过查询v$parameter视图确定参数类型。由于多种参数文件类型的存在,而Oracle的正常运行只使用一种参数文件,Oracle启动过程加载文件顺序为spfilesid.ora -> spfile.ora -> initsid.ora。
5.其他文件(Other Files)
Oracle数据的运行除了以上重要的必须文件以外,还有其他虽然非必须但一样重要的文件结构,比如密码文件、归档日志文件、alter告警日志文件、Trace跟踪文件等等。
Oracle数据库的逻辑结构是一种层次结构,主要由表空间、段、区和数据块等概念组成。逻辑结构是面向用户的,用户使用Oracle开发应用程序使用的就是逻辑结构。数据库存储层次结构及其构成关系,结构对象也从数据块到表空间形成了不同层次的粒度关系。
我们按照上图的结构自上而下描述Oracle数据库的逻辑结构。
1、表空间(Tablespace)
表空间是数据库的逻辑划分,任何数据库逻辑对象在存储时都必须存储在某个表空间中;从上图中我们可以知道每个表空间由多个段组成。表空间一般由一个或多个数据文件构成的,每个数据文件只能属于某一个表空间,也就是说表空间和数据文件时1对N的关系;每个数据库至少有一个表空间(system tablespace),表空间大小等于从属于它的所有数据文件大小的总和;在Oracle 10g中初始创建的只有5个表空间system、temp、undotbs1、sysaux、users。
a、系统表空间(System Tablespace)
System表空间是每个Oracle数据库都必须具备的,数据库创建时自动创建,用于存储数据库系统对象、数据字典、存储过程、触发器和系统回滚段及数据库管理所需的信息;系统表空间的名称是不可更改,系统表空间必须在任何时候都可以用,也是数据库运行的必要条件。因此,系统表空间是不能脱机的。为避免系统表空间产生存储碎片以及争用系统资源的问题,建议创建独立的用户表空间用来单独存储用户对象及数据。
b、临时表空间(Temp Tablespace)
Temp表空间相对于其他表空间而言,临时表空间主要用于存储Oracle数据库运行期间所产生的临时数据,比如SQL排序等。数据库可以建立多个临时表空间。当数据库关闭后,临时表空间中所有数据将全部被清除。
c、回滚表空间(undo tablespace)
回滚表空间是Oracle特有的概念,用于保存Oracle数据库变化前的记录,在对数据库中的记录进行DML操作时,Oracle数据库会将变化前的记录副本保存到回滚表空间中,在rollback,实例恢复(前滚),一致性读CR块的构造时会使用到undo信息,同时保证事务读一致性。在Oracle8i中是rollback tablespace,从Oracle9i开始改为undo tablespace。其中temp是临时表空间,undotbs1是undo回滚表空间。
d、SYSAUX表空间
SYSAUX表空间是随着数据库的创建而创建的,它充当SYSTEM的辅助表空间,主要存储除数据字典以外的其他对象,如果启用EM或Gird Control时,该表空间用于存放EM采集的监控信息。
e、USERS表空间
用户表空间,在创建数据库是自动创建的用户表空间,一般用于维护账户使用的表空间,应用程序表空间一般另外根据应用需求创建。
2、段(Segment)
段是由多个数据区(Extent)构成的,它是为特定的数据库对象(如数据段、索引段、回滚段、临时段)分配的一系列数据区;段内包含的数据区可以不连续,而且可以跨越多个数据文件,使用段的目的是用来保存特定对象。Oracle数据库分为数据段、索引段、回滚段和临时段4种类型。
数据段:数据段也称为表段,它包含数据与表和簇相关,当创建一个表时,系统自动创建一个以该表的名字命名的数据段。
索引段:包含索引相关信息,创建索引时,系统自动创建一个以该索引的名字命名的索引段。
回滚段:包含了回滚信息,DML操作时,Oracle数据库会将变化前的记录副本保存到回滚段中,在rollback,实例恢复(前滚),一致性读CR块的构造时会使用到回滚段信息,同时用于保证事务读一致性。创建数据库时,Oracle会创建默认的回滚段,其管理方式既可以是自动的,也可以是手工的。
临时段:它是Oracle在运行过程中自行创建的段,当一个SQL语句需要临时工作区(比如排序)时,由Oracle创建临时段,一旦语句执行完毕,临时段会自动释放。
3、数据区(Extent)
区是一组连续的数据块,当一个表、回滚段或临时段创建或需要附加空间时,系统总是为之分配一个新的数据区。一个数据区不能跨越多个文件,因为它包含连续的数据块。使用区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位,在Oracle数据库中,分配空间就是以数据区为单位的。一个Oracle对象包含至少一个数据区,设置一个表或索引的存储参数包含设置它的数据区大小。
4、数据块(Data Blocks)
数据块是Oracle最小的存储单位,Oracle数据存放在“块”中,Oracle每次请求数据的时候,都是以块为单位,也就是说,Oracle每次请求的数据是块的整数倍;如果Oracle请求的数据量不到一块,Oracle也会读取整个块,“块”是Oracle读写数据的最小单位或者最基本的单位。特别需要注意的是,这里的“块”是Oracle的“数据块”,不是操作系统的“块”。Oracle块的标准大小由初始化参数DB_BLOCK_SIZE指定,默认标准块大小为8k。具有标准大小的块称为标准块(Standard Block),块的大小和标准块的大小不同的块叫非标准块(Nonstandard Block),同一个数据库实例可以同时存在多种不同的块大小,由初始化参数DB_BLOCK_SIZE指定一个标准块大小。操作系统每次执行I/O的时候,是以操作系统的块为单位;Oracle每次执行I/O的时候,都是以Oracle的块为单位,Oracle数据块大小一般是操作系统块的整数倍。