enq:SQ contention/row cache lock/DFS lock handle(SV) 这三个等待事件都与Oracle 的Sequence 有关。 有关Sequence说明,参考我的Blog:
Oracle Sequence Cache 参数说明
http://blog.csdn.net/tianlesoftware/archive/2010/11/08/5995051.aspx
Oracle 常见的33个等待事件
http://blog.csdn.net/tianlesoftware/archive/2010/08/12/5807800.aspx
Oracle为了管理sequence使用了以下三中锁
(1)row cache lock
在调用sequence.nextval过程中,将数据字典信息进行物理修改时获取,赋予了nocache属性的sequence上发生。
(2)SQ锁 -- enq: SQ
在内存上缓存(cache)范围内,调用sequence.nextval期间拥有此锁,赋予了cache+noorder 属性的sequence上发生。
(3)SV锁 -- DFS lock handle
RAC上节点之间顺序得到保障的情况下,调用sequence.nextval期间获得,赋予了cache+order属性的sequence上发生。
赋予了CACHE属性的sequence调用nextval期间,应该以SSX模式获得SQ锁,许多会话同时为了获取SQ锁而发生争用过程中,若发生争用,则等待enq:SQ-contention.
enq:SQ-contention事件的P2值是sequence的object ID,因此,若利用P2值与DBA_OBJECTS的结合,就可以知道对哪个、 Sequence发生了等待对象。
创建Sequence赋予的CACHE值较小时,有enq:SQ-contention等待增加的趋势,CACHE值较小,内存上事先CACHE的值很快被耗尽,这时需要将数据字典信息物理修改,再次执行CACHE的工作,在此期间,因为一直要拥有SQ锁,相应的Enq:SQ-contention事件的等待时间也会延长,很不幸的是,在创建Sequence时,将CACHE值的缺省值设定为较小20, 因此创建使用量最多的Sequence时,CACHE值应该取1000以上的较大值。
偶而一次性同时创建许多会话,有时会发生enq:SQ-contention等待事件,其理由是V$SESSION.AUDSID(auditing sessionid) 列值是利用Sequence创建的,oracle在创建新的会话后,利用名为SYS.AUDSESS$的sequence的nextval创建AUDSID的值,SYS.AUDSESS$ Sequence的CACHE大小的缺省值设定为 20,许多会话同时连接,可以将SYS.AUDSESS$ sequence的CACHE大小扩大至1000,以此可以解决 enq:SQ-contention等待问题。
RAC上创建Sequence时,在赋予了CACHE属性的状态下:
(1)若没有赋予ORDER属性,则各节点将会把不同范围的Sequence值CACHE到内存上,比如拥有两个节点的RAC环境下,创建CACHE值为100的 sequence时,1节点会使用1-100,2节点会使用101-200。 使用时从各自节点取sequence。
(2)若两个节点之间会通过递增的使用sequence,必须赋予如下ORDER属性。
SQL>Create sequence ordered_sequence cache 100 order;
在order 的情况下,2个节点取的sequence是递增的。 下文会有示例来说明这两种情况。
如果已赋予CACHE+ORDER属性的sequence, oracle使用SV锁进行行同步,即,对赋予了ORDER属性的sequence调用nextval时,应该以SSX模式拥有SV锁,在获取SV锁过程中,若发生了争用,不是等待ROW CACHE或者是enq:SQ-contention,而是等待名为DFS lock handle事件,正因如此V$EVENT_NAME视图上不存在类似与"enq:SV-contention"
DFS lock handle事件是在OPS或者RAC环境下,除了 高速缓冲区 同步之外,还有 行高速缓冲区 或者 库高速缓冲区 同步获取锁的过程中的等待事件。 若保证全局范围内获得锁,在此过程中会发生DFS look handle等待,在获取SV锁的过程中发生的DFS lock handle等待事件的P1,P2值与enq:SQ-contention等待事件相同(p1=mode+namespace,p2=object#).因此会从P1值能确认是否是SV锁,通过P2可以确认哪些是Sequence发生过等待.
SV锁争用问题发生时的解决办法与SQ锁的情况相同,就是CACHE值进行适当的调整,这也是唯一的方法。
测试1:NOORDER的Sequence
node1:
SQL> create sequence seq_noorder start with 1 increment by 1 cache 20 NOORDER;
Sequence created.
SQL> select seq_noorder.nextval from dual;
NEXTVAL
----------
1
SQL> /
NEXTVAL
----------
2
SQL> /
NEXTVAL
----------
3
Node2:
SQL> select seq_noorder.nextval from dual;
NEXTVAL
----------
21
SQL> /
NEXTVAL
----------
22
SQL> /
NEXTVAL
----------
23
node2上不是从4开始的,是从21开始的,因为node1已经cache了20个。
测试2: ORDER的Sequence
node1:
SQL> create sequence seq_order start with 1 increment by 1 cache 20 ORDER;
Sequence created.
SQL> select seq_order.nextval from dual;
NEXTVAL
----------
1
SQL> /
NEXTVAL
----------
2
SQL> /
NEXTVAL
----------
3
Node2:
SQL> select seq_order.nextval from dual;
NEXTVAL
----------
4
SQL> /
NEXTVAL
----------
5
SQL> /
NEXTVAL
----------
6
指定Order 之后,取的序列就是顺序的。
在下面的链接中讲到了RAC 之间序列同步:
Sequences in Oracle 10g RAC
http://www.pythian.com/news/383/sequences-in-oracle-10g-rac/
How does RAC synchronize sequences?
In Oracle 10g RAC, if you specify the “ordered” clause for a sequence, then a global lock is allocated by the node when you access the sequence.
This lock acquisition happens only at the first sequence access for the node (A), and subsequent uses of the sequence do not wait on this lock. If another node (B) selects from that sequence, it requests the same global lock and once acquired it returns the sequence's next value.
The wait event associated with this activity is recorded as “events in waitclass Other” when looked in gv$system_event. So much for event groups, it couldn't be more obscure. That view shows overall statistics for the session.
However if you look in the gv$session_wait_history it shows as “DFS lock handle” with the “p1″ parameter been the object_id of the sequence. This second view has a sample of the last 10 wait events for a session.
In a SQL_TRACE with waitevents (10046 trace) it will be a “DFS lock handle” but in AWR or statspack reports it will be “events in waitclass Other”. So much for consistency.
小结:
没有赋予CACHE属性时,不管ORDER属性是否或RAC环境是否,一直等待ROW CACHE事件,ROW CACHE LOCK是否可以在全局范围内使用的锁,单实例环境或多实例环境同时可以发生。
Oracle Sequence默认是NOORDER,如果设置为ORDER;在单实例环境没有影响,在RAC环境此时,多实例实际缓存相同的序列,此时在多个实例并发取该序列的时候,会有短暂的资源竞争来在多实例之间进行同步。因次性能相比noorder要差,所以RAC环境非必须的情况下不要使用ORDER,尤其要避免NOCACHE ORDER组合。
在RAC等多节点环境下,sequence的CACHE值给性能带来的影响比单节点环境更严重,因此,尽量赋予CACHE+NOORDER属性,并要给与足够大的CACHE值。
但是如果使用了Cache,如果此时DB 崩溃了,那么sequence会从cache 之后重新开始,在cache中没有使用的sequence 会被跳过。即sequence 不连续。 所以只有在多节点高峰并发量很大的情况且对连续性要求不高的情况下,才使用:noorder + cache
根据创建Sequence时赋予的属性,整理等待事件的结果如下:
NOCACHE : --> row cache lock
CAHCE+NOORDER --> enq: SQ-contention(SQ lock)
CACHE+ORDER(RAC): --> DFS look handle(SV lock)
整理自网络
-------------------------------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
Email: dvd.dba@gmail.com
DBA1 群:62697716(满); DBA2 群:62697977(满) DBA3 群:62697850(满)
DBA 超级群:63306533(满); DBA4 群: 83829929 DBA5群: 142216823
DBA6 群:158654907 聊天 群:40132017 聊天2群:69087192
--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请
分享到:
相关推荐
1. **查询等待事件**:首先,可以使用`V$EVENT_NAME`视图查询与enq: IV - contention相关的等待事件。例如: ``` SELECT * FROM V$EVENT_NAME WHERE NAME LIKE '%enq: IV - contention%'; ``` 2. **获取锁定对象...
cause:当插入新的索引条目时,发现索引块中没有足够的空间容纳新的索引条目,索引块就会产生分裂(分为5-5分裂...这时就会表现为enq: TX - index contention。本例中索引块分裂属于5-5 分裂,此分裂可以通过awr报告观察
本篇博客主要聚焦于四种特定的序列等待事件:enq SQ - contention、row cache lock、DFS lock handle和enq SV - contention。 1. **enq SQ - contention**: 这个等待事件发生在多个会话尝试获取对序列(sequence...
【故障处理】enq: PS - contention 是一个Oracle数据库中常见的等待事件,通常与并行服务器(Parallel Server)的资源竞争有关。这篇博客主要讲解如何解决这类问题,并提供了详细的故障分析和解决步骤。 1. **等待...
本案例中,enq:SQ-contention事件等待次数和时间的异常升高,表明序列的cache值设置不当是造成高CPU利用率的主要原因。 本文档还提供了一些技巧和注意事项。例如,对于文章中的代码,可以去指定的云盘下载。如果...
6. **enq:SQ-contention序列等待**:解释SQ-contention类型的队列等待,并提供相关的调优技巧。 #### 1.2.2 相关参考文章链接 为了帮助读者更全面地理解Oracle数据库中的等待事件,本文提供了多个相关文章的链接,...
### 故障处理:Oracle_lhr_队列等待之TX - row lock contention #### 一、概述 在Oracle数据库管理中,“enq:TX-rowlockcontention”是一种常见的队列等待事件,通常与行级别的锁定冲突有关。这种冲突可能会导致...
- **等待事件**:`enq: TX-allocate ITL entry`出现频率较高,说明存在大量事务竞争同一行数据的ITL。 - **AWR报告** 显示该等待事件占据了很高的等待时间比例,达到了85.22%,这进一步证实了该问题的存在。 #### ...
【故障处理】队列等待之TX - allocate ITL entry 引起的死锁处理 队列等待是数据库性能问题中的常见现象,特别是Oracle数据库中,它涉及到事务处理、并发控制和资源分配。TX - allocate ITL entry等待事件是由于...
计算机 → PLC:ENQ PLC → 计算机:ACK PLC → 计算机:STX + 数据 计算机 → PLC:ACK PLC → 计算机:ETX 五、附录 ASCII 码表 ASCII 码表是一个字母数字表,用于计算机和 PLC 之间的通讯。
以SID为269的会话为例,如果它正等待enq:TX — row lock contention事件,意味着它在等待另一个会话释放锁。在Oracle 10g之前,找出阻塞会话可能需要编写资源密集型查询,但在10g中,只需简单查询v$session就能找到...
def enQ(): queue.append(raw_input('Enter new string: ').strip()) #调用list的列表的pop()函数.pop(0)为列表的第一个元素 def deQ(): if len(queue) == 0: print 'Cannot pop from an empty queue!' else: ...
- 等待资源:比如enq: TM - contention和library cache lock。 - 用户进程等待:比如log file parallel write和log file sync。 ### OWI性能调优方法 针对Oracle等待事件进行调优,通常需要一系列的分析和诊断步骤...
通讯控制码:计算机与PLC之间通讯时,通过通讯控制码识别通讯任务,是计算机与PLC之间交流的语言、常用控制码符号STX、ETX、EOT、ENQ、ACK、LF、CR、NAK的通讯控制码代码02H、03H、04H、05H、06H、0A、H、0C、H、0D...
例如,对于"enq:TX - row lock contention"这类等待事件,可能需要考虑事务的并发控制策略或锁的粒度。 总之,Oracle 10g的等待界面改进极大地增强了DBAs在性能监控和问题诊断方面的能力。结合ADDM的自动化分析和...
当系统activity增加或者降低的时候,oracle SMON进程会自动ONLINE或者OFFLINE rollback segments。这样导致某些与undo segments相关的latch或者enqueue被...导致系统很多活跃session都开始等待enq: US - contention。
- 使用`v$session_wait`视图查找等待类型的`ENQ: TX - row lock contention`或`ENQ: TX - deadlock`。 - 查询`v$deadlock`和`v$deadlock_monitor`视图获取死锁信息。 - 执行`DBMS_LOCK.MONITOR`过程来监控死锁...
本教程为RoboCup竞赛无人机集群仿真搜索赛道的Docker配置教程,涉及nvidia-docker的安装配置,docker中显卡的...参考链接为:https://www.yuque.com/minfy/hmckcw/fpk5y5q7enq1ntpi 教程仅供大家共同学习使用,侵权删。
- **enq:TX-rowlock contention**:行级锁争用,表示两个或多个会话尝试在同一行上执行不兼容的操作。 - **latch free**:闩锁等待,表示进程正在等待一个当前被其他进程占用的闩锁。 #### 三、使用与查看数据库...