游标共享怎样使用Mutex

kks 使用mutex以便保护对于下述基于parent cursor父游标和子游标child cursor的一系列操作

对于父游标parent cursor的操作:

  • 基于发生的不同操作,相应不同的等待事件:

    • 在某个父游标名下创建一个新的游标                     ==> cursor:mutex X
    • 检查一个父游标                                                              ==> cursor:mutex S
    • 绑定值捕获                                                                    ==> cursor:mutex X
  • 保护父游标的mutex嵌入在父游标结构内
  • 针对父游标parent cursor的Mutex类型为’Cursor Parent’ (kgx_kks2).
  • 针对父游标parent cursor的Mutex等待事件均为’ Cursor: mutex *’的形式

Mutex是怎样替代library cache pin来保护cursor heap的?

  • 传统的’library cache pin’在10.2.0.2之后默认被代替。 此处PIN被Mutex及其ref count代替。
    当进程运行游标语句时或者须要PIN,或者须要hard parse一个子游标heap。
  • 在版本号10.2.0.1中, 使用mutex部分代码替代PIN的功能默认是不激活的,实际上这取决于隐藏參数_KKS_USE_MUTEX_PIN,在10.2.0.2之后_KKS_USE_MUTEX_PIN默觉得TRUE。 换而言之在版本号10.2中我们还是能够关闭KKS使用MUTEX替代PIN保护CURSOR的,
    可是在版本号11g中则差点儿无法关闭MUTEX。 注意10.2中仅当KKS真正使用MUTEX时,library cache pin不再用作cursor pin。
  • 基于对不同的游标统计信息的操作有不同的等待事件:
    • 为运行某个SQL而PIN一个游标Cursor                        ==>Cursor: Pin S Wait on X
    • 当运行一个游标而PIN Cursor,而该Cursor正被其它进程以S mode检測             ==>  cursor:pin S
  • 当试图重建一个游标Cursor  ==> Cursor: pin X  该等待事件一般不太会看到,由于当一个游标正被运行,且其须要重建时会有还有一个游标被创建
  • 保护游标的mutex嵌入在游标结构内
  • Mutex类型为’Cursor Pin’ (kgx_kks3)
  • 等待事件均为 ‘cursor: pin *’的形式

KKS使用MUTEX情况下SQL语句的 解析与运行的收益

在版本号10.2中。 下面是几个SQL解析与运行从MUTEX哪里获得主要收益:

  • 在某个父游标下构建一个新的子游标

    • 首先这样的构建新子游标的操作更便宜了,  当时Maclean仍要告诫你 一个父游标下过多的子游标仍不是一件好事情
  • 对父游标的检測
    • 在找到一个合适的游标并运行前,父游标须要被适当检測。

      对父游标的这样的检測眼下也使用mutex来保护了,所以这样的检測更的成本更低了

  • 对于已经载入在Library Cache 中的SQL语句反复运行
    • 常规情况下,当一个进程要运行SQL游标前总是必需要先pin它
    • 不使用MUTEX的情况:若游标处于OPEN状态下以便今后的反复运行,且參数cursor_space_for_time(CSFT  眼下已不推荐使用该參数)为TRUE,则每一次反复运行能够不需要library cache pin。 若游标处于OPEN状态下可是cursor_space_for_time=false,则进程在反复运行SQL游标前总是要先拿library
      cache pin
    • 使用MUTEX的情况: 相反,若使用mutex来替代library cache pin时,则无需关心cursor_space_for_time 。 仅第一个进程须要做一个PIN他兴许进程都仅仅须要简单地在相应保护cursor heap的mutex上拿一个共享reference 。

真正理解Mutex相关的等待

Mutex数据结构中存放了Holder id持有者ID 。 Ref Count,和其它Mutex相关的统计信息。

Holder id相应于持有该Mutex的session id (v$session.sid)  。
特别注意, Ref Count是进程并发以S mode參考该Mutex的进程数量

当一个Mutex被以X mode 持有。则Holder id 为相应持有该mutex的session id,而Ref Count为0。

每个共享S mode持有者只添加mutex上的Ref Count。

可供大量session并发以S mode持有參考一个Mutex。 可是注意更新ref count的操作是串行的, 这是为了避免错漏并维护mutex中正确的ref count。

以下我们具体介绍一个运行游标过程中对mutex share pin的过程:

  • 某进程以SHRD 模式申请一个Mutex。并尝试暂时改动该Mutex的Holder ID
  • 若该Mutex正被他人更新,则该session会将Holder id设置为本session的sid,之后该进程将添加ref count,之后再清楚mutex上的Holder id。

    简单来说 这个Holder id是真正做了并行控制的功能。

    若该Holder id 被设置了,则说明该Mutex要么被以EXCL模式持有,要么正有一个其它进程在以S mode申请该Mutex的过程中(比如更新Ref Count)。

    当更新Ref Count时暂时设置holder id的目的就是为了实现避免其它进程并发更新该Mutex的机制。 通过这些样例说明了 , Mutex既能够用作Latch并发控制。 也可用作pin。

  • 若Holder id已被设置。则申请进程将可能进入等待事件 。

    比如若当前Mutex的持有者进程正以X mode更新该Mutex,则申请者的等待事件应为”cursor: pin S on X” 。

    而若当持有者Holder并非”真的要持有” 该Mutex。而不过尝试更新其Ref
    Count,则第二个进程将等在’ Cursor :pin S’等待事件上; 实际正在更新Ref count的操作时非常快的,是一种轻微的操作。 当第一个进程正在更新mutex。则兴许的申请进程将进入spin 循环中255次等待前者结束。

    当mutex上不再有 Holder id时(如前者的进程已经更新完Ref
    Count)时, 则申请者进程将Holder ID设为自身的SID,并更新Ref Count,并清除Holder id。

    若在255次循环SPIN后mutex仍不被释放。则该进程进入等待并不再跑在CPU上。

Mutex的相关统计视图

V$MUTEX_SLEEP

shows the wait time, and the number of sleeps for each combination of mutex type and location.

Column Datatype Description
MUTEX_TYPE VARCHAR2(32) Type of action/object the mutex protects
LOCATION VARCHAR2(40) The code location where the waiter slept for the mutex
SLEEPS NUMBER Number of sleeps for this MUTEX_TYPE and LOCATION
WAIT_TIME NUMBER Wait time in microseconds

V$MUTEX_SLEEP_HISTORY

displays time-series data. Each row in this view is for a specific time, mutex type, location, requesting session and blocking session combination. That is, it shows data related to a specific session (requesting session) that slept
while requesting a specific mutex type and location, because it was being held by a specific blocking session. The data in this view is contained within a circular buffer, with the most recent sleeps shown.

Column Datatype Description
SLEEP_TIMESTAMP TIMESTAMP(6) The last date/time this MUTEX_TYPE and LOCATION was
slept for by theREQUESTING_SESSION, while being held by the BLOCKING_SESSION.
MUTEX_TYPE VARCHAR2(32) Type of action/object the mutex protects
GETS NUMBER The number of times the mutex/location was requested by the requesting session while being held by the blocking session. GETS is
only incremented once per request, irrespective of the number of sleeps required to obtain the mutex.
SLEEPS NUMBER The number of times the requestor had to sleep before obtaining the mutex
REQUESTING_SESSION NUMBER The SID of a session requesting the mutex
BLOCKING_SESSION NUMBER The SID of a session holding the mutex
LOCATION VARCHAR2(40) The code location where the waiter slept for the mutex
MUTEX_VALUE RAW(4) If the mutex is held in exclusive (X) mode, this column shows the SID of the blocking session, else it shows the number of sessions referencing the mutex in S mode.
P1 NUMBER Internal use only
P1RAW RAW(4) Internal use only
P2 NUMBER Internal use only
P3 NUMBER Internal use only
P4 NUMBER Internal use only
P5 VARCHAR2(64) Internal use only.

askmaclean 主要来源。

版权声明:本文博主原创文章,博客,未经同意不得转载。

Mutex(测量)的更多相关文章

  1. Android应用程序窗口(Activity)的测量(Measure)、布局(Layout)和绘制(Draw)过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8372924 在前面一篇文章中,我们分析了And ...

  2. C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent

    看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...

  3. [Android]Dagger2Metrics - 测量DI图表初始化的性能(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5098943.html Dagger2Metrics - 测量D ...

  4. std::unique_lock<std::mutex> or std::lock_guard<std::mutex> C++11 区别

    http://stackoverflow.com/questions/20516773/stdunique-lockstdmutex-or-stdlock-guardstdmutex The diff ...

  5. GPS 气压计高度测量

    气压计测某个点的高度是不准的,因为天气.温度等原因会导致不同时刻同一地点气压不同,所以气压计测量不准.但气压计测量相对高度是很准的.GPS测相对高度不准,但测定点高度比较准.

  6. 单片机与控制实验(5)——重量测量并在LCD12864显示

    一.实验目的和要求 掌握点阵式液晶显示屏的原理和控制方法,掌握点阵字符的显示方法.掌握模拟/数字(A/D)转换方式,进一步掌握使用C51语言编写程序的方法,使用C51语言编写实现重量测量的功能. 二. ...

  7. Allegro之测量时显示两种单位(mil & mm)

    首先确认你工程默认的单位是mil还是mm 例子为mils 在下面的选项中选择另外一项mm即可(如本身是mm,这里选择mils) 点击Apply,然后OK,操作测量功能,如下图所以效果:

  8. WPF整理-Mutex确保Application单例运行

    有时我们不希望我们的WPF应用程序可以同时运行有多个实例,当我们试图运行第二个实例的时候,已经运行的实例也应该弹出来. 我们可以用Mutex来实现 打开App.xaml.cs,在App类中添加如下内容 ...

  9. 前端工程师技能之photoshop巧用系列第二篇——测量篇

    × 目录 [1]测量信息 [2]实战 [3]注意事项 前面的话 前端工程师使用photoshop进行的大量工作实际上是测量.本文是photoshop巧用系列第二篇——测量篇 测量信息 在网页制作中需要 ...

随机推荐

  1. poj1860 解题报告

    题意:这里有N种货币,分别记为1~N,有M种货币交换的方式,每一种方式有A,B两种钱币,有RAB, CAB, RBA and CBA,四个数,表示交换率, Nick手上有其中的一种货币S,货币S的钱数 ...

  2. java大牛list

    1 Java的未来 Java能干什么.不能干什么,一开始就要搞清楚.这对于成为一个纯种的Java程序猿至关重要. 2 构建Java运行环境 Java运行在服务器,服务器都是Linux系统,对于真正程序 ...

  3. OCA读书笔记(2) - 安装Oracle软件

    Objectives: •Describe your role as a database administrator (DBA) and explain typical tasks and tool ...

  4. jeecg智能开发平台参与-2013年度中国优秀开源项目评比

    JEECG正在参与<2013年度中国十大优秀开源项目> 评比,如果大家觉得JEECG还不错, 请投出你宝贵的一票,给我们以支持吧!!! [目前排名第8位] https://code.csd ...

  5. BAPI总的数据库提交和回滚

    BAPI事物中的数据提交和回滚必须通过调用SAP标准业务对象BAPI SERVICE(对象类型SAP0001)的BAPI方法bapiservic.transactioncommit和bapiservi ...

  6. 积累的VC编程小技巧之图标、光标及位图

    1.图标透明 (1).Windows中的图标其实是有两个图像组成的,其中一个用于与它要显示的位置的图像做“AND”操作,另一个作“XOR”操作. 透明:用“白色”AND,用“黑色”XOR 反色:用“白 ...

  7. 积累的VC编程小技巧之视图

    1.如何得到视图指针 [问题提出]    现在你有一个多线程的Demo,你想在多线程里处理视图指针里的函数,我们给这个函数起个名字:Put();该如何实现呢?   //有两种方法可以实现你的要求:   ...

  8. Multiplepack coming~^.^

    多重背包: 基本思路: 先来看一个引例:有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量, ...

  9. Swift - 使用arc4random()、arc4random_uniform()取得随机数

    arc4random()这个全局函数会生成9位数的随机整数   1,下面是使用arc4random函数求一个1~100的随机数(包括1和100) 1 var temp:Int = Int(arc4ra ...

  10. 高级Bash脚本编程指南(27):文本处理命令(三)

    高级Bash脚本编程指南(27):文本处理命令(三) 成于坚持,败于止步 处理文本和文本文件的命令 tr 字符转换过滤器. 必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出 ...