关于library cache pin和library cache lock的定义如下:
(1)library cache lock:访问或修改库高速缓冲区的对象时,对库高速缓冲区句柄获得锁。在获得library cache lock的过程中,如果发生争用,则等待library cache lock事件。
SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name like 'library cache lock';
NAME PARAMETER1 PARAMETER2 PARAMETER3
------------------------------ --------------- --------------- -------------------------
library cache lock handle address lock address 100*mode+namespace
(2)library cache pin:对库高速缓冲区对象访问或修改时,对library cache object(LCO)获得的锁。若library cache lock保护LCO详述,library cache pin则保护LCO内容。在获取library cache pin的过程中,若发生争用,则等待library cache pin事件。
SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name like 'library cache pin';
NAME PARAMETER1 PARAMETER2 PARAMETER3
------------------------------ --------------- --------------- -------------------------
library cache pin handle address pin address 100*mode+namespace
为什么oracle对一个库高速缓冲区对象不用一个锁,而使用library cache lock和library cache pin这两个锁?library cache lock是对句柄获得的,而library cache pin是对LCO获得的。
整理library cache lock和library cache pin相关的性能问题结果如下:
(1)library cache lock和library cache pin等待引起的性能下降现象,大部分是因不适当的DDL(Create、alter、compile、flush、...)引发的。因此在事务繁忙的系统上执行DDL时,应该充分考虑以上内容后执行。偶尔在Hard Parsing频繁的系统上,为防止共享池内存的枯竭(为避免错误ORA-4031),有时会执行flush。但这时可能发生library cache pin等待引起的性能下降现象。而且,flush后sql语句的执行都伴随着Hard Parsing,因此可能引发性能问题。
(2)Hard Parsing频繁的系统上,也可能出现library cache pin等待。不仅是library cache pin,而且与library cache相关的等待大部分是因为过度的Hard Parsing引发的。最好的解决方法是恰当的使用Bind变量,也可以考虑Cursor Sharing等方法。