用户请求执行新的SQL时,Oracle则会利用相关的内存和锁存器执行必要的工作。将这些内容按照时间整理结果如下
1. 用户执行新的SQL时。Oracle在执行基本语法和权限检查等步骤后,获得Hash bucket的library cache锁存器,然后确认库高速缓冲区上是否存在相同的SQL,即相同的LCO。若在获得library cache锁存器的过程中发生争用,则等待latch:library cache事件。存在相同的LCO时直接跳至第8阶段执行,此过程称之为Soft Parsing。每当发生SQL Parsing请求时。Oracle都会增加parse count (total)统计值。
2. 若不存在相同SQL.在获得share pool锁存器后,从空闲列上查找最适合大小的空闲chunk。如果在获得shared pool锁存器的过程中发生争用,则等待latch:shared pool事件。Oracle会一直拥有shared pool锁存器,直到确保chunk为止。
3. 若不存在适合大小的空闲chunk,则查找更大空闲chunk后分割(split)使用。分割后剩下的内存区域重新登记到适当的空闲列。
4. 若检索了所有的空闲列都没有找到恰当的空闲chunk,则检索LRU列。LRU列上的chunk是重建的,而且是当前不使用的。
5. 若在LRU列上检索也不能确保适当大小的chunk,则最佳分配共享池内剩余的内存空间。
6. 以上过程如果均失败,则发生错误ORA-4031.
7. 若找到适当的chunk,对SQL相应的Handle(library cache handle)以Exclusive模式获得library cache lock,并创建LCO信息。创建LCO后,library cache lock变换为null模式,将library cache pin以Exclusive模式获得后,创建执行计划(explain plan).第2-7过程陈伟Hard Parsing。如若发生Hard Parsing,Oracle将增加parse count(hard)统计值。若在Hard Parsing过程中发现SQL语句错误(入参照不存在的对象等),则parse count(failure)统计值将会一起增加。
8. Oracle对SQL Cursor以shared模式获得library cache lock和library cache pin,并执行SQL。这个阶段称为执行阶段。SQL Cursor所参考的LCO(表,Procedure等),基本上与SQL Cursor相同的模式获得的library cache lock和library cache pin。但是执行修改对象信息(如DDL语句)工作时,对相应对象所对应的LCO以Exclusive模式获得Library cache lock和library cache pin。例如‘alter table xxx add varchar2(10)’,这个SQL语句在执行阶段,对于SQL Cursor自身是以Shared模式获得Library cache lock,但是对于表xxx所对应的的LCO是以Exclusive模式获得library cache lock和library cache pin过程中发生争用,则各自需要等待library cache lock和library cache pin事件。
9. Oracle对执行结束的SQL Cursor Fetch数据。这个过程就是Fetch阶段。在Fetch阶段,SQL Cursor将library cache lock变换为Null模式,并解除library cache pin