通过一段时间的学习,对oracle数据库体系有了些浅的认识通过此文方便以后复习巩固和总结。
说到SGA ,SGA是oracle memory 中的 instance中的一块,可以被所有的session共享,比如:执行计划的共享(一些查询语句的表不用再次从database中读取了)。
一个oracle service= SGA+PGA(相当于用户自己的一块空间),SGA 在整个 RDBMS中的地位可以看出是很高的,下面介绍以下SGA这块‘重要的东西’ 里面到底有些什么。
从库池来分 SGA中我所了解的最多的有6个缓存区,他们分别是:Shared pool/database buffer cache/redo log buffer/large pool/stream pool/java pool,简单的介绍三个个重要的buffer cache:Shared pool/database buffer cache/redo log buffer.
共享池中包括 library cache,data directory cache,service result set cache,(uga)
library cache: 是用于sql/plsql的解析场所,存放sql/plsql语句,以及他们的执行计划(软解析),便于和其他用户共享。
data directory cache:存放重要的数据字典,方便其他用户的共享(比如session1用到emp表后,session2也要用emp表就会先从这个缓存区中取出所需要的表)。
service result set cache:用来存放sql,plsql的返回值,可以选在开或者不开,是优化项,(其他session 执行相同的语句时直接从这里取出结果,对优化速度有很大的提升)
UGA(User Global Area):共享服务器连接模式下如果没有配置large pool,则UGA属于SGA的shared pool, 专用连接模式时UGA属于PGA。
用来存放从磁盘上读出来的一些临时数据。
database buffer cache 可以分为 default/nodefault/recycle cache/keep cache.
default :顾名思义,就是默认的,这里默认的意思是默认块的大小,可以通过数据库 show parameter db_block_size,来查看数据库的默认块大小也可以直接从pfile参数文件中查看。
nodefault:表示不是默认的块大小,可以是16k,32k,64k ,如果想要使用非默认块大小的空间,必须先将参数db_nk_cache_size 设置大小,然后再创建自定义块大小的表空间,只需要再创建表空间的时候添加block size nk 即可,如果没有再sga中开出一个nk的buffer创建表空间的时候就会报错。
recycle cache:相关的参数是db_recycle_cache_size 默认为关闭,用途:当读取的表比较大的时候,就可以直接把表读到这里,不进入default的LRU算法中,操作完成时,不会对表进行共享,直接进行回收。
keep cache:与recycle cache的作用相反,经常进行的查询可以放进keep cache中,同样不参与LRU算法,相关的参数是db_keep_cache_size。
clear状态: 未修改或者从未使用的块。
dirty状态:又DML操作的块,有数据变更的块,必须要等instance的后台进程dbwr(写dirty block的进程)刷新到磁盘上才能释放。
pind状态:准备使用的,已经预定好的块。
(LRU算法:分为冷端和热端,如果内存不足时,优先把冷端不常用的内容踢出。)
这块buffer是用来记录当前日志的缓存区,通过instance的后台进程lgwr写入日志文件,如果在归档模式下,会通过arch进程记录到归档日志中,方便以后对数据库的恢复。
刷新日志到.log文件中的4个触发条件:
1)3s原则
2)日志buffer中达到三分之一满的时候
3)commit 提交的时候
4)写dirty buffer block的时候,先记日志,然后dbwr再刷新到磁盘上。
dbwr刷‘脏块’的4个触发条件 :
1)ckpt ,oracle的instacne中的ckpt后台进程触发的完全检查点(检查点又分为:完全检查点,增量检查点,局部检查点)
2)当database buffer cache 的自由空间不足的时候
3)当达到‘脏块’的阈值的时候
4)表空间是read only /offline/backup模式等