每次执行SQL语句,ORACLE都会对其进行解析,并且ORACLE会将那些简单的不带连接的表查询缓存到SGA(system global area)的共享池(shared buffer pool)中,并且这个共享池会被所有数据库用户共享,可以在init.ora中设置这块缓存的大小,数值越大缓存的SQL语句越多,一旦使用了共享池中的SQL语句会大大提升查询性能。
当你向ORACLE 提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句.ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等).
共享的语句必须满足三个条件:
A.字符级的比较:当前被执行的语句和共享池中的语句必须完全相同.
例如:
SELECT * FROM EMP;
和下列每一个都不同
SELECT * from EMP;
Select * From Emp;
SELECT * FROM EMP;
B.两个语句所指的对象必须完全相同:
例如:
用户 对象名 如何访问
Jack Plant_detail public synonym
Jill Plant_detail table owner
以上是两个用户下的同名的两个表,如果针对不同用户的表查询的SQL语句即使字符完全相同也不会满足共享要求。
C. 两个SQL语句中必须使用相同的名字的绑定变量(bind variables)
例如:
第一组的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,赋于不同的绑定变量相同的值)
a.
select pin , name from people where pin = :blk1.pin;
select pin , name from people where pin = :blk1.pin;
b.
select pin , name from people where pin = :blk1.ot_ind;
select pin , name from people where pin = :blk1.ov_ind;