oracle中sql语句执行的过程

共享内存的几大内存

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%'

猜你喜欢

转载自blog.csdn.net/weixin_41086692/article/details/103006817
今日推荐