`

Oracle latch

 
阅读更多
Oracle latch vs lock

	latch			lock
队列行	无队列性		队列性
时长	很短			可能很长
层面	数据库资源层		业务应用层
目的	保证资源的完整性	保证业务操作的完整性


latch在sga中,并不会存在pga中,因为sga中才会存在并发。
latch主要存在两块:

共享池
- sql解析,sql重用

数据缓冲区
-数据访问,数据写入,数据读入
-修改数据块
-数据段扩展

latch获取方式

wait方式--如果无法获取请求的latch,则
1.spin
当一个会话无法获得需求的latch时,会继续使用cpu(cpu空转),达到一个间隔时,会
在此尝试申请latch,知道达到最大重试次数。
2.sleep
当一个会话无法获取需要的latch时,会等待一段时间,达到一个间隔时,在此尝试申请latch,
如此反复,知道达到最大的重试次数。

第一种是系统可以认为立马下次可以获取到latch,而第二种则sleep一段时间后再进行获取

Nowait方式
--如果无法获取请求的latch,则
不会发生sleep或者spin
转而获取其他的可用latch


对于绑定变量,olap中没必要使用绑定变量,因为sql执行不会太多。
而oltp中,建议使用绑定变量。

data buffer中的latch争用
1.表数据块争用。
2.热块索引数据热块
3.文件头修改 --并发修改

模拟下表数据块的争用

admin@ORCL> create table latch_table1 as select * from dba_objects;

Table created.

--创建访问的存储过程
admin@ORCL> create or replace procedure p1 as
  2    l number;
  3  begin
  4    for i in 1 .. 8000 loop
  5      select count(*) into l from latch_table1 where object_type = 'TABLE';
  6    end loop;
  7    dbms_output.put_line('successfully');
  8  end;
  9  /

Procedure created.

--三个会话同时执行访问latch表

admin@ORCL> select distinct sid from v$mystat;

       SID
----------
        10

admin@ORCL> exec p1;


admin@ORCL> select distinct sid from v$mystat;

       SID
----------
       192

admin@ORCL> exec p1;


admin@ORCL> select distinct sid from v$mystat;

       SID
----------
        71

admin@ORCL> exec p1;

--捕获到PID 33在访问时遇到了latch争用的情况。
PID:持有lantch的进程。
SID:持有latch的会话。
LADDR:latch的地址
NAME:latch的名称
GETS:获得latch的次数。


admin@ORCL> select * from v$latchholder;

       PID        SID LADDR                NAME                       GETS
---------- ---------- -------------------- -------------------- ----------
        33         71 000007FF0E175D80     cache buffers chains      88877


--看在会话等待事件视图中总是有这3个会话的“latch 链表”的争用,原因当多个会话同时去访问相同数据块时,它们首先申请latch获得访问权限,
如果此时申请失败,将会产生“latch: cache buffers chains”等待事件,这是因为多个会话在争抢latch资源所致
admin@ORCL> select SID,EVENT from V$SESSION_WAIT where wait_class <> 'Idle';

       SID EVENT
---------- ----------------------------------------------------------------
        10 latch: cache buffers chains
        71 latch: cache buffers chains
       192 latch: cache buffers chains


--创建三个存储过程,测试下数据块修改导致的事件
admin@ORCL> create or replace procedure p2
  2  as
  3        l number;
  4  begin
  5        for i in 1..100
  6        loop
  7           update latch_table1 set object_type='TABLE' where object_type='TABLE';
  8        end loop;
  9        dbms_output.put_line('successfully');
 10  end;
 11  /

Procedure created.

admin@ORCL> create or replace procedure p3
  2  as
  3        l number;
  4  begin
  5        for i in 1..100
  6        loop
  7           update latch_table1 set object_type='INDEX' where object_type='INDEX';
  8        end loop;
  9        dbms_output.put_line('successfully');
 10  end;
 11  /

Procedure created.

admin@ORCL> create or replace procedure p4
  2  as
  3        l number;
  4  begin
  5        for i in 1..100
  6        loop
  7           update latch_table1 set object_type='VIEW' where object_type='VIEW';
  8        end loop;
  9        dbms_output.put_line('successfully');
 10  end;
 11  /

Procedure created.

--首先可以看出,当DML操作进行之前,访问相同的数据块导致了热块,数据块访问的争用。
我们看到DML操作不仅仅有cache buffer chains,还会产生buffer busy waits。

admin@ORCL> select * from v$latchholder;

       PID        SID LADDR                NAME                       GETS
---------- ---------- -------------------- -------------------- ----------
        31        192 000007FF0E176648     cache buffers chains       5798


admin@ORCL> select * from v$latchholder;

       PID        SID LADDR                NAME                       GETS
---------- ---------- -------------------- -------------------- ----------
        32         10 000007FF0E195158     cache buffers chains    1641739

admin@ORCL> select * from v$latchholder;

       PID        SID LADDR                NAME                       GETS
---------- ---------- -------------------- -------------------- ----------
        33         71 000007FF0E162EC8     cache buffers chains    1761049


admin@ORCL> select SID,EVENT from v$session_wait where wait_class <> 'Idle';

       SID EVENT
---------- ----------------------------------------------------------------
        10 buffer busy waits
        71 buffer busy waits
       135 SQL*Net message to client
       192 db file sequential read

--针对热块的问题,可以使用minimize records_per_block;  指定每个数据块中可存放行数减少到最小(即4行)
但这样也会导致Oracle会读取更多的数据块来完成查询。



--说明索引数据块中出现热块的场景

create table t1 (id  number , name  varchar2(200)); 

drop table t1 purge; 


insert into t1  select object_id,object_name from dba_objects;
create index t1_index on t1(id); 

execute dbms_stats.gather_table_stats('ADMIN','T1',cascade=>true);  

  

CREATE OR REPLACE PROCEDURE P10
AS
L NUMBER;
BEGIN
  FOR I IN 1..50000
    LOOP
      SELECT COUNT(*) INTO L FROM T1 WHERE ID < 10000;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('SUCESSFULLY');
END; 


admin@ORCL> select s1.sid, s2.event
  2    from v$session s1, v$session_wait s2
  3   where s1.sid = s2.sid
  4     and s1.status = 'ACTIVE'
  5     and s2.event like '%buffer%'; 

       SID EVENT
---------- ----------------------------------------------------------------
         6 latch: cache buffers chains
         8 latch: cache buffers chains
       197 latch: cache buffers chains 

 --解决办法:创建反向索引 

 

分享到:
评论

相关推荐

    oracle Latch free等待事件

    Oracle数据库中的"Latch Free"等待事件是数据库性能优化的一个重要概念。在深入探讨这个主题之前,我们先要理解什么是Latch和Lock,以及它们之间的区别。 Latch(锁片或轻量级锁)是一种低级别的同步机制,主要用于...

    Oracle中的Latch和Lock.pdf

    Oracle数据库是一种广泛使用的大型关系型数据库管理系统,它在处理并发事务时采用了一种称为“Latch”和“Lock”的并发控制机制。Latch(闩锁)和Lock(锁定)都是Oracle用来确保数据一致性、防止数据冲突的关键组件...

    Resolving_Oracle_Latch_Contention.rar_latch contention_oracle

    在Oracle数据库系统中,"Latch Contention"是一个关键性能问题,它涉及到多个进程或线程在尝试获取同一资源锁(Latch)时的竞争。这通常会导致系统性能下降,因为当一个进程等待另一个进程释放Latch时,数据库操作...

    Oracle性能诊断之——Latch free

    ### Oracle性能诊断之——Latch Free:深入理解与分析 在探讨Oracle数据库的性能优化与故障诊断时,"Latch Free"事件往往成为关注的焦点。这一主题不仅涉及Oracle内存管理的核心机制,还触及到多线程环境下的并发...

    oracle_latch

    Oracle Latch 是数据库管理系统Oracle中的一个重要概念,它是一种同步机制,用于控制对共享资源的并发访问。在Oracle中,Latches被广泛应用于保护各种数据库结构,确保数据的一致性和完整性。Oracle Latch 在多线程...

    Oracle数据库latch和mutex等待事件全面解析

    ### Oracle数据库Latch与Mutex等待事件全面解析 #### 一、引言:理解Latch与Mutex 在Oracle数据库领域,了解Latch和Mutex等待事件对于优化数据库性能至关重要。这些等待事件通常指向了并发控制机制中的竞争问题,...

    Conquering Ora Latch

    ### Conquering Oracle Latch Contention #### 引言 随着Oracle服务器复杂度、事务吞吐量以及并发使用的持续增长,锁竞争问题可能会困扰即便是最有经验的Oracle性能专家。本文档详细介绍了为什么存在锁(Latch),...

    oracle Library cache latch 竞争的解决

    ### Oracle Library Cache Latch 竞争的解决 在Oracle数据库中,`Library Cache Latch`竞争是一个常见的性能瓶颈问题,通常会导致系统响应时间增加、性能下降等问题。本篇文章将详细探讨如何诊断并解决该问题。 ##...

    Oracle等待事件latch解析

    ### Oracle等待事件latch解析 #### 一、什么是Latch? Latch是Oracle数据库中一种重要的低级别内存保护机制,主要用于确保对内存结构的并发访问能够有序地进行。它是一种较为简单的内存结构,其大小大约在100-200...

    学习动态性能表(11)--v$latch$v$latch_children

    【学习动态性能表(11)--v$latch$v$latch_children】主要关注Oracle数据库中的动态性能视图,尤其是关于latch这一关键概念的监控和分析。latch是一种轻量级的锁定机制,用于保护SGA(System Global Area)中的共享...

    latch相关内容讲解

    Oracle提供了多种工具和视图,如V$LATCH、V$LATCH_CHILDREN等,用于跟踪和诊断Latch的竞争情况。通过对这些工具的分析,DBA可以了解哪些Latch是竞争热点,并据此采取措施优化系统性能。 ### 七、获取Latch信息的...

    [Oracle] 浅谈Lock与Latch

    在Oracle数据库系统中,Lock和Latch是两种重要的并发控制机制,它们确保了多用户环境下的数据一致性与安全性。本文将深入探讨Lock与Latch的异同,帮助读者更好地理解和解决可能出现的并发问题。 首先,让我们来看看...

    Latch Free、Library cache伪游标(pseudo cursor)之间的那些事

    LatchFree指的是Oracle数据库在获取 latch时出现的争用问题, latch是数据库内存结构中的一种轻量级的串行化控制机制,用于保护共享内存结构的内部一致性。而Library cache则是Oracle数据库中用于存储SQL语句、PL/...

    让Oracle跑得更快—Oracle 10g性能分析与优化思路ch03.pdf

    ### Oracle 10g性能分析与优化:深入理解Latch及其优化策略 #### 一、Latch与Lock的区别 在Oracle数据库的性能优化过程中,理解和区分Latch与Lock是非常重要的。两者虽然都涉及资源的控制和访问,但其作用机制和对...

    Latch_Lock_And_Mutex_Contention_Troubleshooting

    Latch实际上是一种简单的内存结构,大小通常在100到200字节之间(具体取决于版本和平台),自Oracle 8.0起被封装为Latch State Object结构。Latch可存在于固定共享全局区(SGA)或共享池中,通过硬件原子比较并交换...

    Latch和Lock的区别

    在Oracle数据库系统中,了解和区分Latch(锁存器)和Lock(锁)是非常重要的,因为它们都是数据库并发控制的关键机制,确保数据的一致性和完整性。以下是对这两个概念的详细解释: 1. Latch(锁存器) - 目的:...

    所有参数,latch,等待时间

    在Oracle数据库管理中,"所有参数,latch,等待时间"是三个关键概念,它们对于理解和优化数据库性能至关重要。下面将分别对这三个方面进行详细解释。 首先,"所有参数"通常指的是Oracle数据库的初始化参数...

    等待事件row cache lock,latch row cache objects处理过程.txt

    等待事件row cache lock,latch row cache objects处理过程

Global site tag (gtag.js) - Google Analytics