SQL> connect a/a
Connected.
SQL> create table emp ( x int );
Table created.
SQL> select * from emp;
no rows selected
SQL> connect b/b
Connected.
SQL> create table emp ( x int );
Table created.
SQL> select * from emp;
no rows selected
SQL> conn scott/tiger
Connected.
SQL> select * from emp;
SQL> conn c/c
Connected.
SQL> select * from emp;
SQL> conn/as sysdba
Connected.
SQL> select address,hash_value, executions, sql_text
from v$sql
where upper(sql_text) like 'SELECT * FROM EMP%'
/
ADDRESS  HASH_VALUE EXECUTIONS SQL_TEXT
-------- ---------- ---------- ------------------------
78B89E9C 3011704998          1 select * from emp
78B89E9C 3011704998          1 select * from emp
78B89E9C 3011704998          2 select * from emp
...

  我们可以看到这四个查询的语句文本和HASH值都是一样的,但是由于查询的对象不同,只有后面两个语句是可以共享的,不同情况的语句还是需要硬解析的。因此在检查共享池共同SQL语句的时候,是需要根据具体情况而定的。
  我们可以进一步查询v$sql_shared_cursor以得知SQL为何不能共享的原因:

 

SQL> select kglhdpar, address,
auth_check_mismatch, translation_mismatch
from v$sql_shared_cursor
where kglhdpar in
( select address
from v$sql
where upper(sql_text) like 'SELECT * FROM EMP%' )
/
KGLHDPAR ADDRESS  A T
-------- -------- - -
78B89E9C 786C9D78 N N
78B89E9C 786AC810 Y Y
78B89E9C 786A11A4 Y Y
...