Oracle Latch的使用说明

一、Latch 说明

1.1 Latch

Latch属于System Lock, 用于保护SGA区中共享数据结构的一种串行化锁定机制。Latch的实现是与操作系统相关的,尤其和一个进程是否需要等待一个latch、需要等待多长时间有关。

Latch是Oracle提供的轻量级锁资源,是一种能够极快地被获取和释放的锁,能快速,短时间的锁定资源,防止多个并发进程同时修改访问某个共享资源,它只工作在SGA中,通常用于保护描述buffer cache中block的数据结构。

比如SGA中,各种数据被反复从磁盘读取到内存,又被重新写回到磁盘上,如果有并发的用户做相同的事情,Oracle必须使用一种机制,来保证数据在读取的时候,只能由一个会话来完成,这种保护机制就是Latch。

并发(concurrency):是说有超过两个以上的用户对同样的数据做修改(可能包括插入,删除和修改)。

并行(parallel):是说将一件事情分成很多小部分,让每一部分同时执行,最后将执行结果汇总成最终结果。

与每个latch相联系的还有一个清除过程,当持有latch的进程成为死进程时,该清除过程就会被调用。Latch还具有相关级别,用于防止死锁,一旦一个进程在某个级别上得到一个latch,它就不可能再获得等同或低于该级别的latch。

Latch不会造成阻塞,只会导致等待。 阻塞是一种系统设计上的问题,等待是一种系统资源争用的问题。

1.2  有关SPin 的说明:

比如数据缓存中的某个块要被读取,我们会获得这个块的 latch,这个过程叫做spin,另外一个进程恰好要修改这个块,他也要spin这个块,此时他必须等待,当前一个进程释放latch后才能spin住,然后修改,如果多个进程同时请求的话,他们之间将出现竞争,没有一个入队机制,一旦前面进程释放所定,后面的进程就蜂拥而上,没有先来后到的概念,并且这一切都发生的非常快,因为Latch的特点是快而短暂。

SPIN 与 休眠:

休眠意味着暂时的放弃CPU,进行上下文切换(context switch),这样CPU要保存当前进程运行时的一些状态信息,比如堆栈,信号量等数据结构,然后引入后续进程的状态信息,处理完后再切换回原来的进程状态,这个过程如果频繁的发生在一个高事务,高并发进程的处理系统里面,将是个很昂贵的资源消耗,所以Oracle选择了spin,让进程继续占有CPU,运行一些空指令,之后继续请求,继续spin,直到达到_spin_count值,这时会放弃CPU,进行短暂的休眠,再继续刚才的动作。

1.3  进程获取Latch的过程:

更多精彩内容:http://www.bianceng.cn/database/Oracle/

任何时候,只有一个进程可以访问内存中的某一个数据块,如果进程因为别的进程正占用块而无法获得Latch时,他会对CPU进行一次spin(旋转),时间非常的短暂,spin过后继续获取,不成功仍然spin,直到 spin次数到达阀值限制(这个由隐含参数_spin_count指定),此时进程会停止spin,进行短期的休眠,休眠过后会继续刚才的动作,直到获取块上的Latch为止。

进程休眠的时间也是存在算法的,他会随着spin次数而递增,以厘秒为单位,如1,1,2,2,4,4,8,8,……休眠的阀值限制由隐含参数_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用了很长时间,他会通知PMON进程,查看Latch的占用进程是否已经意外终止或死亡,如果是则PMON会清除释放占用的Latch资源。

总之, Latch获取的流程:请求-SPIN-休眠-请求-SPIN-休眠 … … 占用。

1.4  Latch 和 Lock

从某种意义上说,Latch是内存中的资源锁,数据库对象(表,索引等)的锁叫Lock。

Latch和Lock的区别:

(1)。 Latch是对内存数据结构提供互斥访问的一种机制,而Lock是以不同的模式来套取共享资源对象,各个模式间存在着兼容或排斥,从这点看出,Latch 的访问,包括查询也是互斥的,任何时候,只能有一个进程能pin住内存的某一块,幸好这个过程是相当的短暂,否则系统性能将没的保障,从9I开始,允许多个进程同时查询相同的内存块。

(2)。 Latch只作用于内存中,他只能被当前实例访问,而Lock作用于数据库对象,在RAC体系中实例间允许Lock检测与访问

(3)。 Latch是瞬间的占用,释放,Lock的释放需要等到事务正确的结束,他占用的时间长短由事务大小决定

(4)。 Latch是非入队的,而Lock是入队的

(5)。 Latch不存在死锁,而Lock中存在。

二、Latch 争用

如果发现系统中经常由于Lock 导致用户等待,这时需要考虑系统在逻辑设计上是否有问题,比如多用户对主键的删除或者修改,是否有用户使用select … for update这样的语法,外键是否创建索引的因素。 这些因素是需要结合系统的业务逻辑性来进行数据库对象设计的。

如果发现系统慢是因为很多的Latch争用,就要考虑系统及数据库自身设计上是否存在问题,比如是否使用绑定变量,是否存在热快,数据存储参数设计是否合理等因素。

导致Latch争用而等待的原因非常多,内存中很多资源都可能存在争用。 最常见的两类latch争用如下:

(1)共享池中的Latch争用。

(2)数据缓冲池中的latch争用。

2.1  共享池中的Latch争用

共享池中如果存在大量的SQL被反复分析,就会造成很大的Latch争用和长时间的等待,最常见的现象就是没有绑定变量。

最常见的集中共享池里的Latch是 library cache。 可以通过一下SQL 来查询:

SQL> select * from v$latchname where name like 'library cache%';

LATCH#  NAME                         HASH

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

217 library cache                        3055961779

218 library cache lock                    916468430

219 library cache pin                     2802704141

220 library cache pin allocation             4107073322

221 library cache lock allocation            3971284477

222 library cache load lock                 2952162927

223 library cache hash chains               1130479025

在分析系统性能时,如果看到有library cache 这样的Latch争用,就可以断定是共享池中出现了问题,这种问题基本是由SQL语句导致的,比如没有绑定变量或者一些存储过程被反复分析。

资源的争用可以通过如下SQL 来查看:

SQL> select event,count(*) from v$session_wait group by event;

EVENT                                     COUNT(*)

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

SQL*Ne tmessage from client                         4

Streams AQ: waiting for messages in the queue           1

ASM background timer                              1

时间: 2024-10-03 08:35:13

Oracle Latch的使用说明的相关文章

Oracle Latch与latch的冲突表现

Oracle Rdbms在实际操作中运用到各种类型的相关的锁定机制,Oracle latch就是其经常使用的一种,以下的文章主要是介绍latch(闩)的概念,以及理解latch的实现方法并说明引起latch冲突的原因. 什么是Oracle latch Latch是用于保护SGA区中共享数据结构的一种串行化锁定机制.Latch的实现是与操作系统相关的,尤其和一个进程是否需要等待一个latch.需要等待多长时间有关. Latch 是一种能够极快地被获取和释放的锁,它通常用于保护描述buffer ca

Oracle latch 闩锁结构 总结

以下内容太整理自网络,完全处于学习目的,如有侵权请及时联系我,我会立即删除. 一. Latch 说明 1.1 Latch Latch属于System Lock, 用于保护SGA区中共享数据结构的一种串行化锁定机制.Latch的实现是与操作系统相关的,尤其和一个进程是否需要等待一个latch.需要等待多长时间有关. Latch是Oracle提供的轻量级锁资源,是一种能够极快地被获取和释放的锁,能快速,短时间的锁定资源,防止多个并发进程同时修改访问某个共享资源,它只工作在SGA中,通常用于保护描述b

PHP3中使用ORACLE函数的使用说明

oracle|函数 (作者:星空浪子 zhongcfido@126.com)OCIDefineByName让 SELECT 指令可使用 PHP 变数. 语法: boolean OCIDefineByName(int stmt, string ColumnName, mixed &variable, int [type]); 传回值: 布林值 函式种类: 资料库功能 内容说明 本函式用来定义指定的 PHP 变数,使其能供 SQL 指令中的 SELECT 指令使用.在大小写的问题上要注意一下,因为

PHP中使用ORACLE函数的使用说明

oracle|函数 OCIDefineByName让 SELECT 指令可使用 PHP 变数. 语法: boolean OCIDefineByName(int stmt, string ColumnName, mixed &variable, int [type]); 传回值: 布林值 函式种类: 资料库功能 内容说明 本函式用来定义指定的 PHP 变数,使其能供 SQL 指令中的 SELECT 指令使用.在大小写的问题上要注意一下,因为 Oracle 资料库中的栏位名称其实都是大写的名字.参数

oracle中nmon使用说明

Nmon 工具是 IBM 提供的免费的监控 AIX 系统与 Linux 系统资源的工具.该工具可实时监控系统性能,也可以将服务器的系统资源耗用情况收集起来并输出一个特定的文件,并可利用 excel 分析工具进行数据的统计分析,非常利用 UNIX 或者 Linux 系统的性能数据分析. 1.下载地址 nmon官网 NMON_Analyser官网 本地下载nmon 本地下载nmon_analyser 2.安装nmon 在压缩包中找到相应的版本,上传至服务器,然后授予执行权限 3.主要操作说明 +-H

Oracle over()函数使用说明

例1  代码如下 复制代码 –select * from tmn_zhbg order by id desc select id, mc,fs,class,sum (fs) over (order by fs,id) 连续累加,sum (fs) over (order by fs) 连续累加XX,sum (fs) over (partition by id ) 分组求和, sum (fs) over (partition by id order by fs ) 分组id连续 from ( sel

《Oracle高性能自动化运维》一一2.1 闩(Latch)

2.1 闩(Latch)2.1.1 Latch简介对于对称多处理机(SMP)系统而言,在同一时间点,所有CPU都可以请求修改同一内存.在理想状态下,"请求""更改"操作是由单个CPU独立完成的,而不会被拆分成多个时间片处理.在特殊情况下,"请求""更改"操作将被拆分成多个时间片处理,这时操作系统就会使用上下文结构来保护内存数据的完整性.Oracle 闩(Latch)的作用与上下文类似,主要是用于保护Oracle内存结构被独占访

SQL_Trace 和 10046 +

1.SQL_TRACE 当SQL语句出现性能问题时,我们可以用SQL_TRACE来跟踪SQL的执行情况,通过跟踪,我们可以了解一条SQL或者PL/SQL包的运行情况,SQL_TRACE命令会将SQL执行的整个过程输出到一个trace文件中,我们可以读这个trace 文件来了解在这个SQL执行过程中Oracle 都做了哪些操作.  可以通过sql命令启动SQL_TRACE,或者在初始化参数里面.  SQL>alter session set sql_trace=true; 或者 SQL> alt

oracle中的闩锁(latch)简介

1.闩锁.锁定和并发性 数据库系统本身是一个多用户并发处理系统,在同一个时间点上,可能会有多个用户同时操作数据库.这里就涉及两个很重要的问题. 这些用户之间的操作不会互相破坏.比如两个用户同时在相同的物理位置上写数据时,不能发生互相覆盖的情况.这叫串行化,也就是说,即便两个用户同 时写,也必须有先后,一个用户写完,另一个用户继续写.串行化会降低系统的并发性,但这对于保护数据结构不被破坏来说则是必需的. 在满足串行化的前提下,如何将并发性提升到最大. 在Oracle数据库中,通过闩锁(latch)