当前位置:七道奇文章资讯数据防范Oracle防范
日期:2011-06-15 16:12:00  来源:本站整理

oracle latch工作原理[Oracle防范]

赞助商链接



  本文“oracle latch工作原理[Oracle防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

  latch是一种轻量级用于保护oracle同享内存构造,用户并发操作一致性的串行化锁定机制,如SGA中,各种数据被反复从磁盘读取到内存,又被重新写回到磁盘上,假若有并发用户做相同的事情,oracle必须利用一种机制来保证数据在读取的时刻,只能由一个会话来完成,这就是latch,latch 不会造成阻塞,是只会等候,与每个latch相接洽的还有一个清楚历程,当持有latch的进程成为死进程时,系统排除历程就会被调用,系统lock招致 用户等候,需求考虑系统的逻辑计划能否有问题,如多用户对主键的删除大概改正,能否有效户利用select… for update这样的语法,外键能否成立索引.latch 争用大都要考虑系统及数据库自身计划问题,如绑定变量,热块及参数设置能否公道.
spin:比方数据缓存中的某个块要被读取,我们会得到这个块的 latch,这个历程叫做spin,别的一个进程刚好要改正这个块,他也要spin这个块,此时他必须等候,当前一个进程释放latch后才能spin 住,然后改正,假如多个进程同时恳求的话,他们之间将呈现竞争,没有一个入队机制,
一旦前面进程释放所定,背面的进程就簇拥而上,没有先来后到的概念,并且这一切都发生的非常快,因为Latch的特点是快而短暂.
spin与休眠:
休眠意味着暂时的放弃CPU,举行上下文切换(context switch),这样CPU要保存当行进程运行时的一些状况信息,比方仓库,信号量等数据构造,然后引入后续进程的状况信息,处理完后再切换回本来的进程 状况,这个历程假如频繁的发生在一个高事件,高并发进程的处理系统里面,将是个很高贵的资源损耗,所以Oracle挑选了spin,让进程持续占据 CPU,运行一些空指令,之后持续恳求,持续spin,直到到达_spin_count值,这时会放弃CPU,举行短暂的休眠,再持续方才的行动.
oracle中,latch是一种轻量级的锁.普通来说,latch由三种内存元素成:pid(进程id),内存地址和内存长度.Latch保证对同享数 据构造的排它性拜候,以此来保证内存构造的完好性不遭到破坏.在多个会话同时改正大概检视(inspect)sga中同一个内存构造时,必须串行化拜候以 保证sga中数据构造的完好性.
进程获得latch有两种情势:willing-to-wait和No_wait.no-wait情势只在少数latch中利用.通过no-wait情势 获得latch的统计信息记录在immediate_gets immediate_misses列中,这些列在v$latch,v$latch_parent,v$latch_children视图中都存在.普通来 说,no-wait情势在第一次获得一些有很多子latch的latch比方redo copy时利用.假如一个进程第一次获得这些子latch中的任何一个失利,它会当即便用no-wait情势询问下一个.只有当采取no-wait情势试 图获得全部的子latch都失利今后,才会转而采取willing-to-wait情势.
通过willing-to-wait情势获得latch的统计信息存放在gets和misses列中.每当一个进程用willing-to-wait情势去获得一个latch时,gets城市增添.
假如进程在第一次恳求latch时,latch可用,就会直接得到该latch.在改正任何遭到保护的数据构造之前,进程会将一些恢覆信息写入到latch恢复区,这样当得到latch的进程发生非常时,pmon进程才可以清理该进程持有的latch.
假如恳求latch时,该latch不可用,进程就会在cpu中等候一小段时间(spin)然后重新恳求latch.假如latch一向不可用,该历程 (spin一段时间然后重新恳求)会一向反复.反复的次数由隐含参数_spin_count决意,默许值2000.假如在请_spin_count次之内 得到了latch,就对spin_gets和misses列各加一,不然,进程v$session_wait中记录latch free等候事件,然后释放cpu,转入就寝状况.就寝一按时间后,进程被唤醒并反复上面的历程,一向到得到latch.在成功得到latch后,才会更 行sleep列得统计信息.
由于进程只有在得到latch后才会终止对latch得恳求,假如某个持有latch的进程发生非常,其他恳求该latch的进程该怎么办?岂不是要一向 等候下去?不会的.当一个进程恳求latch失利一定次数后,它会恳求pmon进程查看该latch的持有者,假如持有进程非常,pmon就会清理该进 程,释放latch.
每个latch都有一个从0到13的优先级编号.父latch和独立latch的优先级编号是在oracle内核代码中固定的.子latch是÷在实例启动时成立,其优先级编号从其父latch担当.利用优先级可以避免死锁.
当一个进程恳求no-wait情势的latch时,该latch的优先级编号必须和它当前已经持有的latch的优先级编号相同.
当一个进程恳求willing-to-wait情势的latch时,该latch的优先级编号必须比它当前已经持有的latch的优先级编号要大.
进程获得Latch的历程:
任什么时刻候,只有一个进程可以拜候内存中的某一个数据块,假如进程因为别的进程正占用块而无法得到Latch时,他会对CPU举行一次spin(旋转),时 间非常的短暂,spin过后持续获得,不成功仍旧spin,直到 spin次数到达阀值限制(这个由隐含参数_spin_count指定),此时进程会终止spin,举行短时间的休眠,休眠过后会持续方才的行动,直到获得 块上的Latch为止.进程休眠的时间也是存在算法的,他会随着spin次数而递增,以厘秒为单位,休眠的阀值限制由隐含参数 _max_exponential_sleep掌握,默许是2秒,假如当行进程已经占用了别的Latch,则他的休眠时间不会太长(太长会惹起别的进程的 Latch等候),此时的休眠最大时间有隐含参数_max_sleep_holding_latch决意,默许是4厘秒.这种时间限制的休眠又称为短时间等 待.别的一种情形是长期等候锁存器(Latch Wait Posting),此时等候进程恳求Latch不成功,进入休眠,他会向锁存器等候链表(Latch Wait List)压入一条信号,表示获得Latch的恳求,当占用进程释放Latch时会查抄Latch Wait List,向恳求的进程传送一个信号,激活休眠的进程.Latch Wait List是在SGA区保护的一个进程列表,他也需求Latch来保证其正常运行,默许情形下share pool latch和library cache latch是采取这个机制.
假如将隐含参数_latch_wait_posting设置为2,则全部Latch都采取这种等候方法,利用这种方法可以对比切确的唤醒某个等候的进程, 但保护Latch Wait List需求系统资源,并且对Latch Wait List上Latch的竞争也大概呈现瓶颈.
数据缓冲池Latch争用
拜候频率非常高的数据块被称为热快(Hot Block),当很多用户一同去拜候某几个数据块时,就会招致一些Latch争用,最常见的latch争用有:
(1)  buffer busy waits
(2)  cache buffer chain
Cache buffer chian产生缘由:
当一个会话需求去拜候一个内存块时,它首先要去一个像链表一样的构造中去搜索这个数据块能否在内存中,当会话拜候这个链表的时刻需求得到一个Latch,假如获得失利,将会产生Latch cache buffer chain 等候,招致这个等候的缘由是拜候相同的数据块的会话太多大概这个列表太长(假如读到内存中的数据太多,需求管理数据块的hash列表就会很长,这样会话扫描列表的时间就会增添,持有chache buffer chain latch的时间就会变长,其他会话得到这个Latch的机会就会降低,等候就会增添).
Buffer busy waits 产生缘由:
当一个会话需求拜候一个数据块,而这个数据块正在被另一个用户从磁盘读取到内存中大概这个数据块正在被另一个会话改正时,当前的会话就需求等候,就会产生一个buffer busy waits等候.
产生这些Latch争用的直接缘由是太多的会话去拜候相同的数据块招致热快问题,造成热快的缘由大概是数据库设置招致大概反复履行的SQL 频繁拜候一些相同的数据块招致.
查看造成LATCH BUFFER CACHE CHAINS等候事件的热快
select distinct a.owner, a.segment_name
from dba_extents a,
(select dbarfil, dbablk
from x$bh
where hladdr in (select addr
from (select addr
from v$latch_children
order by sleeps desc)
where rownum<20)) b
where  a.relative_fno=b.dbarfil
and a.block_id<=b.dbablk
and a.block_id+a.blocks>b.dbablk;
查询当前数据库最繁忙的Buffer,TCH(Touch)表示拜候次数越高,热门快竞争问题就存在
select *
from (select addr,
ts#,
file#,
dbarfil,
dbablk,
tch
from x$bh
order by tch desc)
where rownum<11;
查询当前数据库最繁忙的Buffer,结合dba_extents查询得到这些热门Buffer来自哪些对象
select e.owner, e.segment_name, e.segment_type
from dba_extents e,
(select *
from (select addr, ts#, file#, dbarfil, dbablk, tch
from x$bh
order by tch desc)
where rownum<11) b
where e.relative_fno=b.dbarfil
and e.block_id<=b.dbablk
and e.block_id+e.blocks>b.dbablk;
假如在Top 5中发现latch free热门块事件时,可以从V$latch_children中查询具体的子Latch信息
select *
from (select addr, child#, gets, misses, sleeps, immediate_gets igets,
immediate_misses imiss, spin_gets sgets
from v$latch_children
where name= ‘cache buffers chains’
order by sleeps desc)
where rownum<11;
获得当前持有最热门数据块的Latch和buffer信息
select b.addr, a.ts#, a.dbarfil, a.dbablk, a.tch, b.gets, b.misses, b.sleeps
from (select *
from (select  addr, ts#, file#, dbarfil, dbablk, tch, hladdr
from x$bh
order by tch desc)
where rownum<11) a,
(select addr, gets, misses, sleeps
from v$latch_children
where name= ‘cache buffers chains’) b
where a.hladdr = b.addr;
操纵前面的SQL可以找到这些热门Buffer的对象信息
select distinct e.owner, e.segment_name, e.segment_type
from dba_extents e,
(select *
from (select addr, ts#, file#, dbarfil, dbablk, tch
from x$bh
order by tch desc)
where rownum<11) b
where e.relative_fno = b.dbarfil
and e.block_id<=b.dbablk
and e.block_id+e.blocks>b.dbablk;
结合SQL视图可以找到操作这些对象的相关SQL,然后通过优化SQL削减数据的拜候,大概优化某些简单惹起争用的操作(如connect by等操作)来削减热门块竞争
break on hash_value skip 1
select /*+ rule */ hash_value,sql_text
from v$sqltext
where (hash_value, address) in (
select a.hash_value, a.address
from v$sqltext a,
(select distinct a.owner, a.segment_name, a.segment_type
from dba_extents a,
(select dbarfil, dbablk
from (select  dbarfil, dbablk
from x$bh
order by tch desc)
where rownum<11) b
where a.relative_fno = b.dbarfil
and a.block_id <= b.dbablk
and a.block_id + a.blocks > b.dbablk) b
where a.sql_text like ‘%’ || b.segment_name || ‘%’
and b.segment_type = ‘TABLE’)
order by  hash_value, address, piece;   以上是“oracle latch工作原理[Oracle防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • SQL Server中利用Linkserver衔接Oracle的办法
  • Oracle数据库网络与安全FAQ精辟堆积
  • Ubuntu 9.10下安装Oracle10g
  • Ubuntu 10.04 下安装Oracle 11g
  • oracle盲注报错语句和oracle提权语句汇总
  • oracle中to_char、to_number、to_date的用法
  • Python模拟Oracle的SQL/PLUS工具的实现办法
  • Oracle数据库访谈之最年青的OCM访谈
  • oracle表数据误删复原
  • Oracle数据库笔记--表空间
  • Oracle数据库树形查询的代码示例
  • oracle中记录和调集
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .