e fromv$librarycache;?
GETS PINS RELOADS INVALIDATIONS NAMESPACE
---------- ---------- ---------- -------------------------------------------
6802 43040 31 120 SQL AREA
7440 10131 98 0 TABLE/PROCEDURE
1627 2329 0 0 BODY
279 344 0 0 TRIGGER
62 62 0 0 INDEX
233 264 0 0 CLUSTER
88 294 0 0 QUEUE
1 4 0 0 RULESET
17 17 0 0 SUBSCRIPTION
121 216 0 0 EDITION
3 0 0 0 DBLINK
59 0 0 0 OBJECT ID
3530 0 0 0 SCHEMA
1 0 0 0 DBINSTANCE
901 901 0 0 SQL AREA STATS
906 0 0 0 SQL AREA BUILD?
16 rows selected.?
Oracle 9i中通过新的方式记录Library Cache的使用状况。按不同的Hash Chain Size代表Library Cache中包含不同对象的个数。0表示Free的Bucket,>20表示包含超过20个对象的Bucket的个数。从以上列表中看到,包含一个对象的Buckets有217个,包含0个对象的Buckets有130855个。
重启数据库:
13:40:07 sys@felix SQL>startup force
ORACLE instance started.?
Total System Global Area 417546240 bytes
Fixed Size 2228944 bytes
Variable Size 335547696 bytes
Database Buffers 75497472 bytes
Redo Buffers 4272128 bytes
Database mounted.
Database opened.?
14:11:24 sys@felixSQL>select * from scott.emp;?
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
------------------------------ ------------------ ---------- ------------ -------------------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10?
14 rows selected.?
felix SQL>selectSQL_TEXT,VERSION_COUNT,HASH_VALUE,to_char(HASH_VALUE,'xxxxxxxxxx') HEX,ADDRESS
from v$sqlarea where sql_text like 'select * from%emp%';
select sql_text,
username,
ADDRESS,
HASH_VALUE,
to_char(HASH_VALUE, 'xxxxxxxxxx') HEX_HASH_VALUE,
CHILD_NUMBER,
CHILD_LATCH
from v$sqla, dba_users b
wherea.PARSING_USER_ID = b.user_id
andsql_text like 'select * from %emp%';

?
这里可以看出V$SQLAREA和V$SQL两个视图的不同之处,V$SQL中为每一条SQL保留一个条目,而V$SQLAREA中根据SQL_TEXT进行GROUP BY,通过version_count计算子指针的个数。
在以上两次查询中,两条SQL 语句因为其代码完全相同,所以其ADDRESS、HASH_VALUE也完全相同。这就意味着,这两条SQL语句在共享池中的存储位置是相同的(尽管其执行计划可能不同),代码得以共享。在SQL解析过程中,Oracle将SQL文本转换为相应的ASCII数值,然后根据数值通过Hash函数计算其HASH_VALUE,再通过HASH_VALUE在Shared Pool中寻找是否存在相同的SQL语句,如果存在则进入下一步骤;如果不存在则尝试获取Shared Pool Latch,请求内存,存储该SQL代码。
注意到以上输出,仅仅是大小写的不同使得原本相同的SQL语句变成了两条“不同的代码”,所以从这里可以看出,SQL的规范编写非常重要。
SQL解析首先要进行的是语法解析,语法无误后进入下一个步骤,进行语义分析,在此步骤中,Oracle需要验证对象是否存在、相关用户是否具有权限、引用的是否是相同的对象。
对于先前的查询,实际上emp表来自不同的用户,那么SQL的执行计划也就不同了(当
然影响SQL执行计划的因素还有很多,包括优化器模式等),通 过 对 象 依 赖 关 系 可 以 看 到 这 个不同:
看一下Library Cache的结构:
Buffer Cache的管理,其中BucketàBHàBuffer的管理方式与以上LibraryCache的管理原理完全类似。
Library Cache Handle可以被看作库缓存对象的概要信息,Handle上存有指针指向LibraryCache Object,Handle中还包含对象名、namespace、时间戳、引用列表、锁定对象及pin对象列表等信息。这里还需要说明的是Handle上的指针指向的是Library Cache Object的Heap 0,库缓存对象可能占用多个内存Heap,Heap 0则记录了控制信息,包括对象类型、对象依赖表、指向其他Heap的指针等。
下图列举了主要Shared Pool对象的具体内存结构组成。

如果以上两个CRSR访问的是同一个对象,那么这两个SQL才会是真的共享。如果SQL虽然是相同的,访问的却是不同用户的数据表,子指针的概念就体现出来了。
接下来的Data Blocks是个重要的部分,每个控制块包含一个heap descriptor,指向相应的heap memory,这个heap memory包含的就是Diana Tree、P-Code