某
个特定的对象?还是说这个锁在短时间内被请求的次数很多从而造成的竞争?
如果问题是在整个系统层面发生的,一般来说是由于 shared pool 太小或 SQL 语句不共享造成的。一些解决竞争的方法:
增大 shared pool 从而减少 reload 的次数,这是因为 shared pool 过小会造成获取锁的时间加长。
通过将 cursor_sharing 设置为 similar 或 force 来使 SQL 语句共享。
需要小心的是这样做可能会改变SQL的执行计划,所以做之前需要做完整的测试。
在系统不繁忙的时候做统计信息的收集或其它维护作业,从而降低无效化(invalidation)的次数。
如何降低library cache pin
如果"library cache pin"等待的时间很长那么很重要的一点就是判断是只有一两个 process 在等待还是有很多的 process 都在等待。
如果说只是一两个 process 被另一个 process 阻塞的话,那么需要检查持有这个 pin 的 process 为什么这么长时间不释放。
如果说等待是大范围的那么说明 shared pool 需要优化