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"等待事件是数据库性能优化的一个重要概念。在深入探讨这个主题之前,我们先要理解什么是Latch和Lock,以及它们之间的区别。 Latch(锁片或轻量级锁)是一种低级别的同步机制,主要用于...
Oracle数据库是一种广泛使用的大型关系型数据库管理系统,它在处理并发事务时采用了一种称为“Latch”和“Lock”的并发控制机制。Latch(闩锁)和Lock(锁定)都是Oracle用来确保数据一致性、防止数据冲突的关键组件...
在Oracle数据库系统中,"Latch Contention"是一个关键性能问题,它涉及到多个进程或线程在尝试获取同一资源锁(Latch)时的竞争。这通常会导致系统性能下降,因为当一个进程等待另一个进程释放Latch时,数据库操作...
### Oracle性能诊断之——Latch Free:深入理解与分析 在探讨Oracle数据库的性能优化与故障诊断时,"Latch Free"事件往往成为关注的焦点。这一主题不仅涉及Oracle内存管理的核心机制,还触及到多线程环境下的并发...
Oracle Latch 是数据库管理系统Oracle中的一个重要概念,它是一种同步机制,用于控制对共享资源的并发访问。在Oracle中,Latches被广泛应用于保护各种数据库结构,确保数据的一致性和完整性。Oracle Latch 在多线程...
### Oracle数据库Latch与Mutex等待事件全面解析 #### 一、引言:理解Latch与Mutex 在Oracle数据库领域,了解Latch和Mutex等待事件对于优化数据库性能至关重要。这些等待事件通常指向了并发控制机制中的竞争问题,...
### Conquering Oracle Latch Contention #### 引言 随着Oracle服务器复杂度、事务吞吐量以及并发使用的持续增长,锁竞争问题可能会困扰即便是最有经验的Oracle性能专家。本文档详细介绍了为什么存在锁(Latch),...
### Oracle Library Cache Latch 竞争的解决 在Oracle数据库中,`Library Cache Latch`竞争是一个常见的性能瓶颈问题,通常会导致系统响应时间增加、性能下降等问题。本篇文章将详细探讨如何诊断并解决该问题。 ##...
### Oracle等待事件latch解析 #### 一、什么是Latch? Latch是Oracle数据库中一种重要的低级别内存保护机制,主要用于确保对内存结构的并发访问能够有序地进行。它是一种较为简单的内存结构,其大小大约在100-200...
【学习动态性能表(11)--v$latch$v$latch_children】主要关注Oracle数据库中的动态性能视图,尤其是关于latch这一关键概念的监控和分析。latch是一种轻量级的锁定机制,用于保护SGA(System Global Area)中的共享...
Oracle提供了多种工具和视图,如V$LATCH、V$LATCH_CHILDREN等,用于跟踪和诊断Latch的竞争情况。通过对这些工具的分析,DBA可以了解哪些Latch是竞争热点,并据此采取措施优化系统性能。 ### 七、获取Latch信息的...
在Oracle数据库系统中,Lock和Latch是两种重要的并发控制机制,它们确保了多用户环境下的数据一致性与安全性。本文将深入探讨Lock与Latch的异同,帮助读者更好地理解和解决可能出现的并发问题。 首先,让我们来看看...
LatchFree指的是Oracle数据库在获取 latch时出现的争用问题, latch是数据库内存结构中的一种轻量级的串行化控制机制,用于保护共享内存结构的内部一致性。而Library cache则是Oracle数据库中用于存储SQL语句、PL/...
### Oracle 10g性能分析与优化:深入理解Latch及其优化策略 #### 一、Latch与Lock的区别 在Oracle数据库的性能优化过程中,理解和区分Latch与Lock是非常重要的。两者虽然都涉及资源的控制和访问,但其作用机制和对...
Latch实际上是一种简单的内存结构,大小通常在100到200字节之间(具体取决于版本和平台),自Oracle 8.0起被封装为Latch State Object结构。Latch可存在于固定共享全局区(SGA)或共享池中,通过硬件原子比较并交换...
在Oracle数据库系统中,了解和区分Latch(锁存器)和Lock(锁)是非常重要的,因为它们都是数据库并发控制的关键机制,确保数据的一致性和完整性。以下是对这两个概念的详细解释: 1. Latch(锁存器) - 目的:...
在Oracle数据库管理中,"所有参数,latch,等待时间"是三个关键概念,它们对于理解和优化数据库性能至关重要。下面将分别对这三个方面进行详细解释。 首先,"所有参数"通常指的是Oracle数据库的初始化参数...
等待事件row cache lock,latch row cache objects处理过程