共享内存的几大内存
1)shared pool(共享池):
主要作用是提高SQL语句以及PL/SQL语句的执行效率,缓存执行过的SQL语句,执行计划;PL/SQL语句的代码块、执行码等(该部分称为library cache);以及在编译SQL, PL/SQL语句是参照的数据字典信息(该部分称为dictionary cache或row cache)。是SGA中最重要的部分之一。
2)database buffer cache(数据库缓冲区):
主要作用是缓存曾经读取过的数据块,Oracle数据库中对数据的所有修改操作都是在buffer cache中进行的。因为所有的操作都必须先将物理文件上的数据块读取到buffer cache中,然后才能进行各种操作。buffer cache是SGA中最大的内存区域,也是SGA中最重要的部分之一。
3)redo log buffer(重做日志缓冲区):
缓存生成的redo log记录,日志写后台进程会将log buffer中的记录写到磁盘中。也是SGA中最重要的部分之一。
4)Large pool(大池):
可选的内存池,其主要作用是分担shared pool的压力。某些情况,比如备份恢复,如果没有分配Large pool,则会从shared pool中分配内存,这会增加shared pool的负担。
5)Java pool(Java池):
用于Java程序使用。
6)stream pool(流池):
数据库在流工作是使用的内存区域。
sql执行过程
server process承载sql--->去libray cache寻找之前的执行计划
1.客户端输入一条sql语句。
2.sql语句通过网络传输到oracle数据库实例。
3.server process接收sql语句。
*oracle实例将sql语句解析成sql执行计划,然后才能执行
*解析的时候会消耗I/O、CPU,查询执行的sql涉及到的视图等系列资源有没有权限,或者是否存在
4.在shared pool中对数据做修改(缓存sql语句和解析执行计划)
执行计划将数据从DBF文件,缓存到buffer Cache中,由DBWriter进程写入DBF文件,DBWriter进程有自己的写入机制。
5.server process对表的修改,产生日志,日志缓存在redo buffer中,由LogWriter进程写入redo.log文件中,LogWriter进程有自己的写入机制
这就是,在用户端使用server process, 后台进程写入数据,用户关注server process的处理速度。
shared pool在sql执行中的作用:
将常用的sql执行计划缓存在SP中,减少解析的步骤,有的话在SP中直接使用,没有的话,新解析新生成,这一系列动作由server process进程去做。
buffer Cache:
减少I/O的使用率,涉及到一个概念,命中率。
sql语句的硬解析
shard pool大体分为3部分
1.free空间。
2.library cache的空间。
3.字典缓存(row cache),缓存oracle自身的信息。
--查询shard pool 主要组成的cache size
select * from v$sgastat a where a.NAME = 'library cache';
select * from v$sgastat a where a.pool = 'shared pool' and a.NAME = 'free memory';
select * from v$sgastat a where a.NAME = 'row cache';
sql语句的解析类型
软解析
硬解析
执行计划在librarycache中找不到,发生硬解析,比较消耗资源。
--查询软解析和硬解析的次数,软硬解析的具体情况
--我们期望软解析多,硬解析多的时候需要引起注意
select name,value from v$sysstat where name like 'parse%'