oracle SGA内存结构简述

前端之家收集整理的这篇文章主要介绍了oracle SGA内存结构简述前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

oracle SGA内存结构简述

介绍oracle系统全局内存区域,包括库高速缓存以及缓冲区缓存的作用,利用其设计原理,优化sql

1、SGA 共享池

共享池是oracle存储程序数据的地方,执行后的每个sql语句在共享池中都存有解析后的内容。同时也存储oracle使用的系统参数。共享池顾名思义,所有用户可以共享其内容,因此如果不同用户执行相同sql,则只需编译一次。因此我们写的sql尽可能的保持一致,避免每个sql语句都是唯一的,影响性能

2、库高速缓存

oracle执行的每个sql语句,其必须被解析并载入库高速缓存中,库高速缓存是SGA中专门用来缓存之前已经解析过的sql区域。如果从来没有解析过,则需要解析,内容包括验证语法、提及的对象,以及确认该对象的用户权限,这个过程称为硬解析;如果已经执行过,则直接取之前已经解析后的信息重用,称之为软解析

3、避免硬解析

sql语句对应字符串生成唯一散列值,因此相同sql语句,因为大小写、或没有使用绑定变量,虽然返回结果相同,但实际每次执行前都需要硬解析。绑定变量语法如下:
SELECT * FROM EMPLOYEES WHERE EMP_ID = :V_EMP_ID;

这里并没有直接给一个固定的emp_id,而是使用变量代替。
- jdbc
String v_id = ‘xxxxx’;
String v_sql = ‘select name from table_a where id = ? ‘; //嵌入绑定变量
//String v_sql = ‘select name from table_a where id = ’ + v_id ; – 没有使用绑定变量
stmt = con.prepareStatement( v_sql );
stmt.setString(1,v_id ); //为绑定变量赋值
stmt.executeQuery();
- mybatis

默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义。${} 则不使用绑定变量,只是简单替换,会造成数据库端硬解析。

执行sqlSelect * from emp where name = #{employeeName}

参数:employeeName=>Smith
解析后执行sql:Select * from emp where name = ?

执行sqlSelect * from emp where name = ${employeeName}

参数:employeeName传入值为:Smith
解析后执行sql:Select * from emp where name = Smith

4、SGA缓冲区缓冲

缓冲区缓存是SGA内存区域中最大的部分之一。数据库块从硬盘中读取出来后或写入硬盘之前,用它来存储数据库块。块是oracle进行操作的最小单位,块中含有表数据行或索引条目,一些还包含用来排序的临时数据。执行数据块不在缓冲去缓存,则需要访问操作系统获取这些块,然后在将结果集返回之前放入缓冲区缓存。直接从缓冲区缓存中读取,称为逻辑读取,从操作系统读取称为物理读取。逻辑读取显然优于物理读取,我们的目标就是尽量开发出能够重用共享池和缓冲区缓存中信息的代码

猜你在找的Oracle相关文章