sga的组成 简述oracle_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会进行必要的安全检查和转义。${} 则不使用绑定变量,只是简单替换,会造成数据库端硬解析。

执行SQL:Select * from emp where name = #{employeeName}

参数:employeeName=>Smith

解析后执行的SQL:Select * from emp where name = ?

执行SQL:Select * from emp where name = ${employeeName}

参数:employeeName传入值为:Smith

解析后执行的SQL:Select * from emp where name = Smith

4、SGA缓冲区缓冲

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值