Oracle的体系结构大致上分为两部分:Instance(实例)和Database(数据库)。java
如图1所示:web
图1 Oracle 数据库体系结构
sql
咱们平时说的Oracle Server(Oracle服务器)就是由 Oracle Instance 和 Oracle Database 组成的,如图2:
图2 Oracle Server
数据库
Oracle Instance |
SGA缓存
SGA包含6 个基本组件:Shared Pool(Library Cache,Data Dictionary Cache)、Database Buffer Cache、Redo Log Buffer、Java Pool、Large Pool、stream pool。安全
下面将分别介绍这6个基本组件的功能。服务器
1) shared poolsession
共享池是对 SQL、PL/SQL 程序进行语法分析、编译、执行的内存区域。oracle
共享池由 Library Cache(库缓存)、Data Dictionary Cache(数据字典缓存)和 Server Result Cache(结果缓存)等组成。函数
它们分别都有哪些做用呢?
Library Cache: SQL 和 PL/SQL 的解析场所,存放着通过编译解析后的SQL和PL/SQL语句的内容,以备全部用户共享。
* 若是下次再执行一样的 SQL 语句的时候,就不须要解析了,当即从 Library Cache 获取执行。
* Library Cache的 SIZE 会决定着编译解析 SQL 语句的频度,从而决定了性能。
* Library Cache中又包含两部份内容:Shared SQL Area和Shared PL/SQL Area。
Data Dictionary Cache: 存放重要的数据字典信息,以备数据库使用。
* Data Dictionary是使用最频繁的,几乎全部的操做都须要到数据字典去查询。为了提升访问Data Dictionary的速度,此时须要一个Cache,须要的时候访问内存便可。
* Data Dictionary Cache里面的信息包含了Database Files、Tables、Indexes、Columns、Users、Privileges和其余的数据库对象。
Server Result Cache: 存放服务器端的 SQL 结果集及 PL/SQL 函数返回值。
看了上面的讲解,或许会以为有些抽象,下面将经过一个例子进行讲解。
假设在客户端提交一个命令,以下:
SELECT ename,sal FROM emp WHERE empno=7788;
若是数据库是第一次被提交这条语句,则须要进行解析,解析过程分为硬解析和软解析。
Library Cache会把这条 sql 语句和执行计划装入其中。
装入这些东西有什么做用呢?
下次再敲一摸同样(标点符号、大小写、空格彻底一致)的语句时,就不须要硬解析了。
小问答:
若是此时客户端再提交一条命令:
select ename,sal from emp where empno=7788;
猜想一下,这条语句须要被解析吗?
答案:须要。
小说明:注意哦,语句必须彻底同样才不须要解析哦。标点符号、大小写、空格等都要彻底一致哦!平时规范书写的好处在这里就体现啦。
前面有说到,如果 select 语句,执行完后还会返回结果集。那结果集存放在哪里呢?
select ename,sal from emp where empno=7788;
该语句执行返回的结果集将存放在 Server Result Cache 中。
2) Database Buffer Cache
小说明:逻辑读(从内存读)的速度是物理读(从磁盘读)的1万倍呦,因此仍是想办法尽可能多从内存读哦。
因此,数据缓冲区的大小对数据库的读取速度有直接的影响。
例如用户访问一个表里面的记录时,数据库接收到这个请求后,首先会在Database Buffer Cache中查找是否存在该数据库表的记录,若是有所需的记录就直接从内存中读取该记录返回给用户(有效提高了访问的速度),不然只能去磁盘上去读取。
继续看上面的例子:
select ename,sal from emp where empno=7788;
该条语句以及它的执行计划被放在Library Cache里,但语句涉及到的数据,会放在 Database Buffer Cache 里。
小问答:
Database Buffer Cache是怎么工做的呢?
这就要说一说Database Buffer Cache的设计思想了。
磁盘上存储的是块(block),文件都有文件号,块也有块号。
若要访问磁盘上的块,并非CPU拿到指令后直接访问磁盘,而是先把块读到内存中的Database Buffer cache里,生成副本,查询或增删改都是对内存中的副本进行操做。如图3所示。
另外,若是是增删操做,操做后会造成脏块,脏块会在恰当时机再写回磁盘原位置,注意哦,可不是马上写回呦。
也许你会问,为何不马上写回呢?
由于:
(1)减小物理IO;
(2)可共享,若后面又有对该块的访问,可直接在内存中进行逻辑读。
图3 访问数据块
小问答:
为何要经过内存访问数据块,而不是CPU直接访问磁盘呢?
答:由于相较于CPU,IO的速度实在是太慢了,CPU的速度是IO 的100万倍呢?若是CPU直接访问磁盘的话,会形成大量的IO等待,CPU的利用率会很低。因此,利用速度至关的内存(CPU速度为内存的100倍)作中间缓存,能够有效减小物理IO,提升CPU利用率。
可是,这里会有一个问题。前面说到查询或增删改都是对内存中的副本进行操做,当增删改操做产生脏块时不会马上写回磁盘。
小问答:
咱们设想一下,若是在 Database Buffer Cache 中存放大量将来得及写回磁盘的脏块时,忽然出现系统故障(好比断电),致使内存中的数据丢失。而此时磁盘中的块存放的依然是修改前的旧数据,这样岂不是致使前面的修改无效?
要怎样保持事务的一致性呢?
答:若是咱们可以保存住提交的记录,在 Database Buffer Cache 中一旦有数据更改,立刻写入一个地方记录下来,不就能够保证事务一致性了嘛。
小说明:Instance在断电时会消失,Instance在内存中存放的数据将丢失。这就须要 Redo Log Buffer 发挥它的做用啦。
3)Redo Log Buffer
4)Large Pool(可选)
5)Java Pool(可选)
6)Stream Pool(可选)
Background process
在正式介绍 Background Process 以前,先简单介绍 Oracle 的 Process 类型。
Oracle Process 有三种类型:
小补充:
Connection & Session
Connection是指一个Oracle的客户端和后台和后台的进程(Server Process)创建的TCP链接。如图4所示:
图4 Connection
Connection 创建过程可简单描述以下:
1.首先创建 TCP 链接,Oracle 对用户的身份进行认证、进行安全审计等等;
2.当这些都经过后, Oracle 的 Server Process 才会容许客户端使用Oracle提供的服务;
3.当 Oracle 的链接创建起来之后,就意味着开始了一个 Session (会话),当链接断开的时候这个会话就消失了。
Session 是和 Connection 相辅相成的。Session信息会存储在 Oracle 的 Data Dictionary 中。
可经过图5直观看出 Connection 和 Session 的区别。
图5 Connection & Session
Background Process(后台进程)主要包括:SMON(系统监控器进程 )、PMON(进程监控器进程)、DBWR( 数据库写入程序进程)、LGWR(日志写入程序进程)、CKPT(检查点进程)。
1)PMON(Process Monitor)
PMON的主要做用以下:
2)SMON(System Monitor)
SMON的主要做用以下:
3)DBWR(Database Writer)
DBWn是Oracle中工做最繁重的进程。主要做用以下:
小说明:
若是数据库的负荷比较大,来自于客户端的请求比较多,存在大量的IO操做,须要频繁的将缓冲区的内容写到磁盘文件上,那么这时就能够配置多个DBWn(一共Oracle支持20个DBWn,DBW0-DBW9,DBWa-DBWg)。一般一个中小型的Oracle只须要一个DBW0 Process就能够了。
注意:如下几种状况发生时,都会触发DBWR Process将 Database Buffer Cache 的内容写到Data Files :
小补充:
服务器进程对数据文件执行读操做,而 DBWR 负责对数据文件执行写操做。
小问答:
Commit 时 DBWR 有何动做?
答:什么也不作!
4)LGWR((LOG Writer))
Oracle Instance中只有一个LGWR Process,这个Process的工做和DBWR Process相似。主要做用以下:
注意:如下几种状况发生时,都会触发LGWR Process将 Redo Log Buffer 中的内容写到 Redo Log Files :
怎么保证提交的事务永久保留呢?
答:已执行update操做为例 。
1. 当写提交语句的时候,修改已经写到 Redo Log Buffer 里了;
2. 当看到返回提交成功时,说明修改已经写到磁盘 Redo Logfile 里了;
3. 因此提交成功后,改动已经同步到磁盘了,不会丢了。
5)CKPT(Checkpoint)
CKPT的主要做用以下:
6)ARCn(Archiver)
ARCn的主要做用以下:
当Oracle运行在归档模式时
经过上面的学习,先把图1更新以下:
图6 Oracle 数据库体系结构
Database |
Database 其实就是由一堆物理文件组成的,主要是用于存储数据,Database 中主要包含三种类型的文件:Data Files、Control Files、Redo Log Files。
另外还有Parameter File、Password File、Achieved Log Files等。
1)Data Files(数据文件)
2)Control Files(控制文件)
3)Redo Log Files(重作日志文件)
4)Parameter File(参数文件)
5)Archived Log Files(归档日志文件)
6)Password File(密码文件)
小问答:
Instance 和 Database 的对应关系是怎样的呢?
答:Instance :Database = n :1
1个 Instance 只能属于1个数据库,能够多个 Instance 同时访问1个数据库。
小补充:
Oracle 的内存结构(Memory Structure)
Oracle 的 Memory Structure 实际上包含两部份内容:SGA和PGA
SGA(System Global Area系统全局区)
PGA(Program Global Area程序全局区)