一、SGA--共享池
共享池是oracle缓存程序数据的地方.执行过的每一条sql语句在共享池中都存有解析后的内容.这个部分称作库高速缓存.在oracle解析每条sql之前,先检查库高速缓存,如果存在,就使用该信息.库高速缓存共享所有用户的所有sql.
共享池还包括oracle的系统参数,这一块被称为数据字典高速缓存.
二、库高速缓存
如下三条sql语句尽管返回的结果一样,但是在oracle中对应的hash_value值却不一样,oracle在执行sql语句时,会先把sql语句的字符串转换为哈希值,再有其他sql执行时,先根据哈希值进行匹配.匹配成功则取出该信息进行下一步操作.
SQL> select * from scott.emp where job='MANAGER';
SQL> select * /* a_comment*/ from scott.emp where job='MANAGER';
SQL> select * /* a_comment*/ from scott.emp where JOB='MANAGER';
SQL_TEXT HASH_VALUE
------------------------------ ----------
select * from scott.emp where 1888432946
job='MANAGER'
select * /* a_comment*/ from s 762411267
cott.emp where job='MANAGER'
select * /* a_comment*/ from s 210500030
cott.emp where JOB='MANAGER'
这三条语句因为字符串的大小写和注释,导致Hash_value值不一样,所有每次执行时都是硬解析,那么什么叫做软解析呢?----使用绑定变量
SQL> var job varchar2(10);
SQL> exec :job := 'MANAGER';
PL/SQL 过程已成功完成。
SQL> select * from scott.emp where job = :job;
已选择14行。
SQL> exec :job := 'CLERK';
PL/SQL 过程已成功完成。
SQL> select * from scott.emp where job = :job;
SQL> select sql_text , hash_value from v$sql where sql_text like '%scott.emp%';
SQL_TEXT HASH_VALUE
------------------------------ ----------
select * from scott.emp where 2635465461
job = :job
这就是为什么我们在使用jdbc的时候优先使用PreparedStatement.
本文是在学习的同时,当作笔记写的.有不对的,还请大家指出.