library cache pin与PROCEDURE的重建

前面提到,Oracle10g重建Procedure的处理有所增强,最初看到这个增强的时候,我想这个增强是否可以减少困扰已久的Library Cache的竞争呢?

我们看一下以下测试,首先在第一个session执行操作:SQL> create or replace PROCEDURE pining

2 IS

3 BEGIN

4 NULL;

5 END;

6 /

Procedure created.

SQL>

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Session altered.

SQL> create or replace procedure calling

2 is

3 begin

4 pining;

5 dbms_lock.sleep(60);

6 end;

7 /

Procedure created.

SQL>

SQL> col object_name for a30

SQL> select object_name,last_ddl_time from dba_objects where object_name in ('PINING','CALLING');

OBJECT_NAME LAST_DDL_TIME

------------------------------ -------------------

CALLING 2007-04-02 09:12:57

PINING 2007-04-02 09:12:57

SQL>

SQL> exec calling;

此时Calling对于Pining的引用将会在Pining的Body上获得共享Pin,此时在另外一个Session执行重建Procedure的操作:SQL> create or replace PROCEDURE pining

2 IS

3 BEGIN

4 NULL;

5 END;

6 /

这个操作将一直挂起,直到第一个session的操作完成,此时在第三个session可以观察到Library Cache Pin的竞争:SQL> select sid,event from v$session where username='EYGLE'

2 /

SID EVENT

---------- ----------------------------------------------------------------

137 library cache pin

139 PL/SQL lock timer

157 SQL*Net message to client

当第一个session执行完成之后,第二个session的操作随之完成,我们可以看到LAST_DDL_TIME并未改变:

SQL> exec calling;

PL/SQL procedure successfully completed.

SQL>

SQL> select object_name,last_ddl_time from dba_objects where object_name in ('PINING','CALLING');

OBJECT_NAME LAST_DDL_TIME

------------------------------ -------------------

CALLING 2007-04-02 09:12:57

PINING 2007-04-02 09:12:57

实际上session 2执行了一次无谓的Library Cache Pin,理想的方式应该是,Oracle能够判断之前的Library Cache Pin的模式,如果是共享模式,则可以跳过Pin请求,如果是排他模式,则必须等待,目前的处理并不能从实质上改变竞争。

不过并非全无益处,我们发现,对于另一类DDL操作,Oracle完全可以跳过Library Cache Pin的请求,这类操作是Grant,在以前版本中的行为可以参考:

http://www.eygle.com/archives/2004/10/shared_pool-5.html

在Oracle10g中,Grant授权操作无需再获得Library Cache Pin的排他锁,我们看以下测试:

在Session 1中执行:09:40:18 SQL> drop procedure calling;

Procedure dropped.

09:40:18 SQL>

09:40:18 SQL> drop procedure pining;

Procedure dropped.

09:40:18 SQL>

09:40:18 SQL> create or replace PROCEDURE pining

09:40:18 2 IS

09:40:18 3 BEGIN

09:40:18 4 NULL;

09:40:18 5 END;

09:40:18 6 /

Procedure created.

09:40:18 SQL>

09:40:18 SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Session altered.

09:40:18 SQL> create or replace procedure calling

09:40:18 2 is

09:40:18 3 begin

09:40:18 4 pining;

09:40:18 5 dbms_lock.sleep(60);

09:40:18 6 end;

09:40:18 7 /

Procedure created.

09:40:18 SQL>

09:40:18 SQL> col object_name for a30

09:40:18 SQL> select object_name,last_ddl_time from dba_objects where object_name in ('PINING','CALLING');

OBJECT_NAME LAST_DDL_TIME

------------------------------ -------------------

CALLING 2007-04-02 09:40:18

PINING 2007-04-02 09:40:18

09:40:18 SQL>

09:40:18 SQL> exec calling;

在Session 2执行授权:SQL> set time on

09:40:22 SQL> grant execute on pining to sys;

Grant succeeded.

09:40:22 SQL>

我们看到Session 2的授权顺利通过,再转到Session 1:09:40:18 SQL> exec calling;

PL/SQL procedure successfully completed.

09:41:18 SQL>

09:41:18 SQL> select object_name,last_ddl_time from dba_objects where object_name in ('PINING','CALLING');

OBJECT_NAME LAST_DDL_TIME

------------------------------ -------------------

CALLING 2007-04-02 09:40:18

PINING 2007-04-02 09:40:22

我们看到对象PINING的LAST_DDL_TIME已经变化。

看来Grant已经能够绕过了Library Cache Pin的竞争,这是Oracle10g的增强。

这个问题最早由网友dqpylf在阅读我的新书《深入浅出Oracle》,在不同版本中测试案例时发现,今天才有时间做一点探究,感谢dqpylf。

-The End-

By eygle on 2007-04-02 09:42 |

Comments (6) |

SQL.PLSQL | 1398 |

6 Comments

到11g再做这个时, 是不是又变了呢? Create procedure是非可以顺利通过呢?

grant is ok , but not for revoke. it still needs library cache pin though , interesting.

revoke的确会触发library cache pin ,有意思

估计对已经有权限的再授权的话, 就不会pin了吧, 应当试试, 一开始已给了public的权限, 后来再给user显式地授权.

oracle 存储过程挂起,library cache pin与PROCEDURE的重建相关推荐

  1. (转载)library cache lock和library cache pin到底是什么

    (http://www.dbsnake.net/library-cache-lock-and-pin.html) Posted: December 16, 2011 | Author: Cui Hua ...

  2. oracle package lock,Oracle 11g下重现library cache lock等待事件

    从下面的例子中可以看到,在生产数据库中对象的重新编译会导致library cache lock,所以应该尽量避免在业务高峰期编译对象.如果是package或过程中存在复杂的依赖关系就极易导致libra ...

  3. 怎么发现RAC环境中#39;library cache pin#39;等待事件的堵塞者(Blocker)?

    怎么发现RAC环境中的'library cache pin'等待事件的堵塞者(Blocker) 參考自 How to Find the Blocker of the 'library cache pi ...

  4. 记一次library cache lock/library cache pin导致的函数编译hang住分析及处理过程

    墨墨导读:业务在进行alter function my_function_name compile时,有两个函数编译无法通过,现象就是会hang住,这里分享处理的整个过程. 一.前言 业务在进行alt ...

  5. Oracle后台专家解决library cache锁争用的终极武器

    今天来给大家分享一个Oracle使用中的小技巧. 当某条SQL语句或者对象被反复访问,过多的软解析可能会造成大量的"library cache:mutex X"争用,有什么样的方法 ...

  6. 周三直播丨Oracle 12cR2 ADG LGWR Library Cache案例分享

    Active DataGuard上的library cache lock案例,应该算是Oracle 11g 版本上常见的经典BUG,Oracle也相继给出了几个隐含参数和补丁修复解决方案,但为何打了补 ...

  7. 直播丨Oracle 12cR2 ADG LGWR Library Cache案例分享

    Active DataGuard上的library cache lock案例,应该算是Oracle 11g 版本上常见的经典BUG,Oracle也相继给出了几个隐含参数和补丁修复解决方案,但为何打了补 ...

  8. Oracle Library Cache 的 lock 与 pin 说明

    一. 相关的基本概念 之前整理了一篇blog,讲了Library Cache 的机制,参考: Oracle Library cache 内部机制 说明 http://blog.csdn.net/tia ...

  9. 并行insert出现library cache lock与cursor: pin S wait on X等待问题记录

    一. 故障现象与紧急处理 开发反馈凌晨5点左右应用出现大量报错 ORA-04021: timeout occurred while waiting to lock object,并且集中出现在inse ...

最新文章

  1. PyTorch核心开发者灵魂发问:我们怎么越来越像Julia了?
  2. 1元体验微软公有云,看起来还不错
  3. HDLBits 系列(ending)此系列我的答案
  4. gin context和官方context_gin 源码阅读(一) -- 启动
  5. 783. 二叉搜索树节点最小距离
  6. 看动画学算法之:递归和递归树
  7. koa --- [MVC实现之三]换个角度重新开始-初始化
  8. python wmi 重启网卡_python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法...
  9. 第 197 章 Unity
  10. linux命令:软件更新 sudo apt-get update 和 sudo apt-get upgrade
  11. 分离圆环图显示百分比_excel这个百分比图,你不一定会制作
  12. 尔雅 科学通史(吴国盛) 个人笔记及课后习题 2018 第一章 科学通史绪论
  13. winword.exe应用程序错误0xc0000142
  14. 视频教程-太空大战游戏实战课程-其他
  15. 解决ios微信页面回退不刷新的问题
  16. idea 断点线程_在IntelliJ IDEA中多线程并发代码的调试方法
  17. Mask RcNN论文翻译
  18. PHP:计算字符串中汉字的个数、正确计算字符串的长度
  19. 最方便正则验证手机号
  20. Java基础知识(重点)总结(Java学习方法、系统学习路线)

热门文章

  1. 很现实、很暴力的面试法则 —— 来自招聘官的自述
  2. GC之7大垃圾收集器详解(上)
  3. 使用 pyenv 管理 Python 版本
  4. FATAL: NO bootable medium found! System halted
  5. linux-防火墙有关知识积累
  6. 大剑无锋之分布式和微服务分别是什么?【面试推荐】
  7. leetcode 954. Array of Doubled Pairs | 954. 二倍数对数组(Java)
  8. leetcode 260. Single Number III | 260. 只出现一次的数字 III(位运算:分组异或)
  9. 【Python】import pandas时,报错 pandas Missing required dependencies ['numpy'] 原因分析
  10. 【Android开发】文本框、按钮、文本编辑框、提交登录、单选框