這篇文章主要為大家展示了“Oracle Study中Oracle等待事件怎么用”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Oracle Study中Oracle等待事件怎么用”這篇文章吧。
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括浦江網(wǎng)站建設(shè)、浦江網(wǎng)站制作、浦江網(wǎng)頁(yè)制作以及浦江網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,浦江網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到浦江省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
Oracle Study之--Oracle等待事件
什么是enqueue
enqueue可以做名詞,也可以做動(dòng)詞來(lái)解釋。做名詞時(shí),指的的是一種鎖的類型,比如Tx enqueue。做動(dòng)詞時(shí),則是指將鎖請(qǐng)求放入到請(qǐng)求隊(duì)列的操作。
我們知道,lock是一種需要排隊(duì)的鎖實(shí)現(xiàn)機(jī)制,這和latch是不一樣的,latch是一種輕量級(jí)的鎖,是不需要排隊(duì)得。Enqueue就是lock的排隊(duì)機(jī)制的實(shí)現(xiàn)。
lock是用來(lái)實(shí)現(xiàn)對(duì)于共享資源的并發(fā)訪問的。如果兩個(gè)session請(qǐng)求的lock是兼容的,則可以同時(shí)鎖定資源,如果兩個(gè)session請(qǐng)求的lock是不兼容的,則其中一個(gè)session必須等待另外一個(gè)session釋放其持有的lock后,才能獲得對(duì)共享資源的鎖定。這時(shí),等待的session的lock請(qǐng)求就需要進(jìn)入到一個(gè)隊(duì)列當(dāng)中,這就是enqueue等待。
什么是enqueue resource
Lock有三種可能的狀態(tài):已獲得,轉(zhuǎn)換或者等待。對(duì)于某一個(gè)lock,可能一些session已經(jīng)獲得該lock,某些session請(qǐng)求轉(zhuǎn)換,也有某些session在請(qǐng)求持有但無(wú)法成功而導(dǎo)致等待。所以,對(duì)于一個(gè)lock,需要三個(gè)隊(duì)列來(lái)描述這些session的狀態(tài)。這個(gè)三個(gè)隊(duì)列,分別稱為Owner,waiter和convert隊(duì)列,由一個(gè)結(jié)構(gòu)來(lái)管理,就是enqueue resource。
enqueue是有名字的,其名字就是對(duì)應(yīng)的lock的類型加上ID1,ID2參數(shù)構(gòu)成,形如
通過(guò)v$resource視圖可以查看當(dāng)前系統(tǒng)中的enqueue。
由于系統(tǒng)中有很多類型的lock同時(shí)存在,那么enqueue resource結(jié)構(gòu)實(shí)際上是一個(gè)數(shù)組,其長(zhǎng)度由隱含參數(shù)_enqueue_resources控制,也就是說(shuō),該參數(shù)控制了系統(tǒng)中可同時(shí)存在的lock的數(shù)量。如果超過(guò),則會(huì)報(bào)以下錯(cuò)誤:
ORA-00052: "maximum number of enqueue resources exceeded"
通過(guò)v$resource_limit視圖可以查看系統(tǒng)中各種資源的利用情況。
什么是enqueue lock
enqueue lock就是lock本身。oracle使用了和enqueue reouserce分離的另外一個(gè)數(shù)組來(lái)管理enqueue lock,這個(gè)數(shù)組的長(zhǎng)度由隱含參數(shù)_enqueue_locks控制。
通過(guò)視圖v$enqueue_lock可以查看該數(shù)組中的具體內(nèi)容。
什么是enqueue hash
通過(guò)上面關(guān)于enqueue resource的描述,我們可以知道,oracle查找一個(gè)lock時(shí),需要先在enqueue resource數(shù)上查找到該lock的位置。
如果每次都在數(shù)組上順序查找,顯然效率較低。我們知道hash是一種高效的查找算法,所以oracle對(duì)于enqueue resource的查找也采用了hash方式,引入了一個(gè)hash數(shù)組,其大小由隱含參數(shù)_enqueue_hash控制。
通過(guò)對(duì)enqueue的名字
相應(yīng)的,為了保護(hù)這個(gè)hash數(shù)組,需要引入一個(gè)latch:enqueue hash chain。該latch有若干個(gè)子latch,由隱含參數(shù)_enqueue_hash_chain_latches控制
什么是enqueue freelist
同樣的,對(duì)于enqueue resource數(shù)組中的空閑位置,需要通過(guò)一個(gè)freelist列表來(lái)管理,這樣每次在請(qǐng)求新的位置時(shí),不至于要掃描整個(gè)數(shù)組。enqueue freelist由enqueues latch的保護(hù)。
實(shí)際上,enqueue resource的Hash管理方式,和buffer cache/library cache的管理方式非常的相像。如果想更深入的了解enqueue hash,resource和lock,可以dump出具體的結(jié)果看看:
alter session set events ’immediate trace name enqueues level 3’;
Enqueue
Enqueue 這個(gè)詞其實(shí)是lock 的另一種描述語(yǔ)。
當(dāng)我們?cè)贏WR 報(bào)告中發(fā)現(xiàn)長(zhǎng)時(shí)間的enqueue 等待事件時(shí),說(shuō)明數(shù)據(jù)庫(kù)中出現(xiàn)了阻塞和等待,可以關(guān)聯(lián)AWR報(bào)告中的enqueue activity部分來(lái)確定是哪一種鎖定出現(xiàn)了長(zhǎng)時(shí)間等待。
這個(gè)等待事件有2個(gè)參數(shù):
Name: enqueue 的名稱和類型。
Mode: enqueue的模式。
可以使用如下SQL 查看當(dāng)前會(huì)話等待的enqueue名稱和類型:
SELECT event, CHR (TO_CHAR (BITAND (p1, -16777216)) / 16777215) || CHR (TO_CHAR (BITAND (p1, 16711680)) / 65535) "Lock", TO_CHAR (BITAND (p1, 65535)) "Mode" FROM v$session_wait WHERE event like 'enq%';
Oracle 的enqueue 包含以下模式:
模式代碼 解釋 1 Null (NULL) 2 Row-S(SS) 3 Row-X(SX) 4 Share(S) 5 S/Row-X(SSX) 6 Exclusive(X)
Oracle的enqueue 有如下類型:
Enqueue 縮寫 縮寫解釋 BL Buffer Cache management BR Backup/Restore CF Controlfile transaction CI Cross-instance Call Invocation CU Bind Enqueue DF Datafile DL Direct Loader Index Creation DM Database Mount DR Distributed Recovery Process DX Dirstributed Transaction FP File Object FS File Set HW High-water Lock IN Instance Number IR Instance Recovery IS Instance State IV Library Cache Invalidation JI Enqueue used during AJV snapshot refresh JQ Job Queue KK Redo Log “Kick” KO Multiple Object Checkpoint L[A-p] Library Cache Lock LS Log start or switch MM Mount Definition MR Media recovery N[A-Z] Library Cache bin PE Alter system set parameter =value PF Password file PI Parallel slaves PR Process startup Parallel slave synchronization Q[A-Z] Row Cache RO Object Reuse RT Redo Thread RW Row Wait SC System Commit Number SM SMON Sequence Number SQ Sequence Number Enqueue SR Synchronized replication Sort segment ST Space management transaction SV Sequence number Value TA Transaction recovery TC Thread Checkpoint TE Extend Table TM DML enqueue TO Temporary Table Object Enqueue TS Temporary Segement(also TableSpace) TT Temporary Table TX Transaction UL User-defined Locks UN User name US Undo segment, Serialization WL Being Written Redo Log XA Instance Attribute Log XI Instance Registration Lock
案例分析:
12:54:01 SYS@ prod>conn scott/tiger Connected. 12:54:05 SCOTT@ prod>select * from tab; TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- BONUS TABLE DEPT TABLE DEPT1 TABLE EMP TABLE SALGRADE TABLE T1 TABLE 6 rows selected. 12:54:09 SCOTT@ prod>grant all on dept1 to tom; Grant succeeded. Elapsed: 00:00:00.37 12:54:23 SCOTT@ prod>update dept1 set dname='beijing' where deptno=10; 2 rows updated. Elapsed: 00:00:00.04 12:54:41 SCOTT@ prod>rollback; Rollback complete. Elapsed: 00:00:00.03 12:55:22 SCOTT@ prod>update dept1 set dname='NetWork' where deptno=10; 2 rows updated. Elapsed: 00:00:00.02 12:54:51 SYS@ prod>conn tom/tom Connected. 12:54:56 TOM@ prod>update scott.dept1 set loc='hongkong' where deptno=10; 12:59:18 SYS@ prod>col event for a50 12:59:26 SYS@ prod>r 1 SELECT event, CHR (TO_CHAR (BITAND (p1, -16777216)) / 16777215) 2 || CHR (TO_CHAR (BITAND (p1, 16711680)) / 65535) 3 "Lock", 4 TO_CHAR (BITAND (p1, 65535)) "Mode" 5 FROM v$session_wait 6* WHERE event like 'enq%' EVENT Lock Mode -------------------------------------------------- ---- ---------------------------------- enq: TX - row lock contention TX 6 Elapsed: 00:00:00.01 13:22:48 SYS@ prod>select a.ORACLE_USERNAME,a.SESSION_ID,b.TYPE,b.LMODE,b.REQUEST,b.block,o.object_name from v$locked_object a,v$lock b,dba_objects o 2* where a.session_id=b.sid and a.object_id=o.object_id ORACLE_USERNAME SESSION_ID TY LMODE REQUEST BLOCK OBJECT_NAM ------------------------------ ---------- -- ---------- ---------- ---------- ---------- SCOTT 42 TX 6 0 1 DEPT1 TOM 38 TM 3 0 0 DEPT1 SCOTT 42 TM 3 0 0 DEPT1 TOM 38 TX 0 6 0 DEPT1 TOM 38 AE 4 0 0 DEPT1 SCOTT 42 AE 4 0 0 DEPT1 6 rows selected.
以上是“Oracle Study中Oracle等待事件怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!