Oracle 11g R2 体系结构
安装oracle软件----创建数据库----在数据库中创建表----表里存储信息---这些表文件需要存储在物理硬盘上面。
假如有一个用户(这个用户可以是远程用户,也可以是本地的,也可以是一个应用程序)连接到oracle数据库上面,用户是不能直接连接在硬盘上存储的数据文件,所以在oracle中要运行一个实例,实例并不是保存在硬盘上面的,实例是内存的一部分,而库和表文件是存放在硬盘上面的,用户不能直接访问库里面的数据,只能访问实例,实例是一个特殊的内存块,只有实例能和数据库直接通信,在咱们的实验环境中实例和数据库是在同一台机器上,我们称之为单实例环境,对于用户而言所有的操作都是在实例中完成的,oracle为实例划分了一个内存块,这个内存块我们称之为SGA,其实oracle实例启动的时候,将会分配一个SGA系统全局区并启动一些oracle的后台进程(守护进程)。
SGA核心组件介绍:
在oracle中内存=SGA+PGA
一个实例只能有一个SGA,所有的服务器进程和后台进程都共享一个SGA
PGA:
我们先看一下一个select语句是如何被执行的?
如果hr用户写了一个select * from scott.emp;
第一步:先做编译,编译包含了语法的检查和语义的检查。
第二步:如果编译没有问题会进入shared pool(共享池 )中,而shared pool 是由library cache和data dictionary cache(数据字典缓存)组成。Sql语句第一时间会进入librarycache中,即library cache中会存放被编译过的正确的sql语句,仅仅是sql语句而已。library cache中没有缓存的sql语句需要进行硬解析(即需要耗费设备的I/0资源从硬盘读取)。假设library cache中有这个sql语句,就不需要做硬解析,接着会查 data dictionary cache。data dictionary cache中缓存了权限和对象数据及属性,所有data dictionary cache检查hr用户是否对scott.emp表是否具有访问权限,如果有权限继续往下执行,如果没有权限,直接给hr用户返回一个结果。如果一条语句从来都没有被执行过,这条语句首先被缓存在share pool中的library cache中,下一次被执行的时候直接从share pool中取sql语句。存放sql语句也需要占用空间,share pool的空间也是有限的,为了防止share pool空间不够用,采用先进先出的规则即后执行的sql语句会覆盖先执行的sql语句来释放空间,当然share pool的空间越大越好。
我们通过企业管理器来查看share pool的相关信息
在sql plus中可以用以下方式查看,图中"0"表示自动化管理
可以从v$sgainfo中查看shared pool size
SQL> select name,bytes/1024/1024||'MB' from v$sgainfo;
Shared Pool Size
256MB
Large Pool Size
16MB
Java Pool Size
16MB
第三步:data buffer cache现在hr用户可以访问scott.emp表了,databuffer cache的作用就是从磁盘或存储中将数据块调入内存,缓存在buffer cache中。
举例:
用户第一次访问scott.emp的内容
SQL> set timing on
SQL> select * from scott.emp;第一次执行sql语句
已选择14行。
已用时间: 00: 00: 00.05
SQL> /再次执行上一条命令所用的时间为00: 00: 00.00
已选择14行。
已用时间: 00: 00: 00.00
总结:buffer cache缓存数据本身,library cache缓存sql语句本身。
可以通过show parameter db_cache_size查看buffer cache的大小
第四步:redo log buffer<重做日志缓冲区>当用户执行insert,update,delete,create,alter等操作后,数据发生了变化,这些变化了的数据写入数据缓冲区(buffer cache)之前,先写入重做日志缓冲区,同时变化之前的数据也放入重做日志缓存中,这样做,是为了保证在数据恢复时oracle就知道哪些事务需要提交,哪些事务需要撤回。
如果对此文有什么问题的话,请加下面微信一起探讨