[ORACLE物理结构 ]
当一个Oracle实例开始运行的时候,它会分配一个称之为【SGA】(系统全局区这样的一个大的内存块),实例的SGA被该是咧的所有后台进程所共享,在整个SGA区域里面,包括DB buffer(数据库高速缓存区)、大共享区、共享池、Redo buffer(日志缓存区)、 固定的SGA。整个SGA也是oracle实例最重要的实例存储结构。其中我们需要重点解读的是DB buffer、共享池。
【DB BUFFER(数据库高速缓存区)】
或许我们也可以这样理解数据库高速缓存区:如果每次执行一个sql查询的时候,oracle都必须从磁盘中读取数据块,并且在改变之后,又必须把每一个数据块写入磁盘,那么oracle执行效率就会非常的慢。而oracle的缓存区经常能够使用内存中的数据块,在那里就会很快的得到访问,内存中用来频繁访问数据的区域,就被称为数据库的高速缓存区,它也是SGA区域里面最大的一个部分。它包括一下的三个缓存值
保持缓存池
对于想在内存中长期保存的频繁访问的如代码表使用该缓存池。该缓存池在数据库关闭前一直保留,并不从内存中释放空间
再生缓存池
它的作用是想尽快从内存中排除的对象,我们可以使用再生缓存池,比如说频繁访问的大表
默认缓存池
需所有的段块一般都在默认池中缓存,此池就是原来的缓冲区池要强调的一点在oracle8i之前,它仅仅支持缓存器池,我们可以通过设定缓存器池的大小
【共享池】
共享池 就是Oracle缓存一些“程序”数据的地方,共享池的特点是有大量小的内存块,共享池的规模对数据库的性能有着非常重要的影响
主要由库缓存区和字典缓存区构成
共享池作用:用来缓存共享池PL /SQL程序单元,SQL语句的执行版本以及相关的执行计划
库缓存区 包括:共享SQL区和PL/SQL区
需要注意的是不同缓存区的功能
在库缓存区中共享SQL区保留了sql语句的解释版本,以便于再次使用的时候不必重新解释,提高进程的速度
PL/SQL区保留了PL/SQL的过程、函数等程序单元的编译版本,以便于所用的用户能够共享。在共享的SQL区里面它保留了数据库的用户解执行sql语句的解释版本,目的使这些语句再次被执行的时候能够提高进程的速度。
对于PL/SQL区,当程序执行一个单元的时候及PL/SQL执行单元有两个或者两个以上的用户,需要执行相同的过程、相同的函数或相同触发器等相关内容的时候,oracle并不缓存两个或者两个以上的内存区域。oracle是通过把相同的代码,做一个拷贝被不同的用户所缓存来处理的!
字典缓存区 是oracle用来缓存字典信息的一个区域,当分析sql语句来校验表名、列名,数据类型等等信息的时候,oracle将频繁使用数据字典,通过把最频繁使用数字字典的信息放到字典缓存区中,Oracle 可以减少执行SQL所引起的一些相关性能上的冲突
Redo:Redo 日志缓存池,负责放置需要写入Redo的日志记录,我们在数据库文件系统里面,包括Redo的日志文件,通过一个日志的书写进程来对日志文件进行操作,如果数据需要写到在线重做日志中,则再写到磁盘之前要在重做缓存区中临时缓存这些数据通过一个日志的书写进程来控制日志的书写操作。它是oracle以循环的方式进行先进先出的缓存器池
【大共享区】
大共享区它是oracle可选的特征 它提供了一个分配大存块一个隔离内存区 ,不一定需要大的共享区,如果选择多线程的服务器,共享服务器连接,语句的并行执行,或者使用进行备份和IMN相关操作的时候可能会使用到它。
【固定的SGA区】
固定的SGA区是我们不能设定大小的,完全是由oracle自己独立去控制的,在这个区域中,包换了一组指向SGA其它组件的变量,还有一些变量包含了各个参数的值我们也可以把这个区看成SGA中的自启区,Oracle内部要使用这个区来找到SGA的其它区
这是整个在oracle当中的内存区域
【Oracle逻辑存储结构 】
数据库由一个或多个表空间组成
在oracle逻辑结构当中主要有一下几部分组成
表空间:是用户可以在Oracle系统中使用的最大的逻辑存储结构。用户在数据库中建立的所有内容都会存储在表空间中。每个Oracle数据库斗提前配置了system表空间,它存储数据字典和系统管理信息。表空间由一个或多个数据文件组成,表空间包含段
段 :(表、索引)由一个或多个盘区租场。段是用户建立的数据库对象的存储表示。用户建立的每一个表都会有一个在表空间中存储的逻辑段,为用户所建立的对象生成的段都要占用空间,段存在于表空间中,但是表空间中可以有许多数据文件中的数据
在Oracle系统中有三种类型的段,即:数据库,临时段,回滚段(撤销段)
数据段:是存储表、索引、簇、表分区等常规应用的地方
1:数据段保存表中的记录。在create table时、Oracle为表创建它的数据段
2: ORacle中未分区的表用一个段来保存数据,分区的表为每个分区ujianli一个独立的数据段
3:在创建表时可以通过storage子句指定段中区的分配方式
索引段
1:在索引段中保存的是索引的条目。在创建索引的时候,oracle为索引创建索引段
2:oracle中未分区的索引段用一个段保存数据,分区的索引为每个分区建立一个独立的索引段
3: 在创建索引时通过storage自己来指定索引段中区的分配方式
临时段:用于临时保存解析过的查询语句以及在排序过程中产生的临沭数据。
UNDO段(回滚段)用于管理数据库中的undo数据,并且为事务处理提供数据库的读取一致性视图
盘区:是一个磁盘上连续的块的组。一个盘区在一个表空间中。且在表空间中单一的文件中;
盘曲的字典管理方式
段 :是数据库中最小的分配单元,也是数据库使用的最小I/O单元
其中一个表空间对应一个或多个数据文件,在Oracle物理结构中我们可以知道在Oracle物理结构组成里面包括控制文件,数据文件和日志文件,其中我们所存储的对象信息以及相关的记录数据,实际上存储到oracle的数据文件当中,但是在逻辑上我们将这些表以及表中的数据是存储到表空间当中的,所以表空间和物理的数据文件存在一对多的映射关系 ,一个表空间对应若干个数据文件,我们从数据文件当中并不能直接解读表的信息,这也是关于很多数据库一个共通的特点。
一个表空间包含多个段(sgement)
段:从逻辑上讲它和表空间也存在一对多的关系,但是我们的段和物理的数据文件并不存在一一对应关系换句话说 一个表空间包含很多物理数据文件,一个表空间包含多个段,但是一个段可能跨了不同的数据文件来进行存储
同时一个段包含多个盘区,oracle存储的最基本的单位是块,在windows平台下默认的块的大小是8K(8192个字节)我们可以在安装全局数据库之前来设定它的大小,比如说16K,但是oracle块的大小一定是我们操作系统大小的整数倍。所以 oracl存储数据最基本单位是块。 由如干个块组成一个盘区,由若干个盘区组成一个段,有如干个段组成一个表空间。我们真正指定表存储的时候只能指定这个表存储到哪个表空间当中