您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Oracle Study中Oracle等待事件怎么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Oracle Study中Oracle等待事件怎么用”這篇文章吧。
Oracle Study之--Oracle等待事件
什么是enqueue
enqueue可以做名詞,也可以做動詞來解釋。做名詞時,指的的是一種鎖的類型,比如Tx enqueue。做動詞時,則是指將鎖請求放入到請求隊列的操作。
我們知道,lock是一種需要排隊的鎖實現機制,這和latch是不一樣的,latch是一種輕量級的鎖,是不需要排隊得。Enqueue就是lock的排隊機制的實現。
lock是用來實現對于共享資源的并發訪問的。如果兩個session請求的lock是兼容的,則可以同時鎖定資源,如果兩個session請求的lock是不兼容的,則其中一個session必須等待另外一個session釋放其持有的lock后,才能獲得對共享資源的鎖定。這時,等待的session的lock請求就需要進入到一個隊列當中,這就是enqueue等待。
什么是enqueue resource
Lock有三種可能的狀態:已獲得,轉換或者等待。對于某一個lock,可能一些session已經獲得該lock,某些session請求轉換,也有某些session在請求持有但無法成功而導致等待。所以,對于一個lock,需要三個隊列來描述這些session的狀態。這個三個隊列,分別稱為Owner,waiter和convert隊列,由一個結構來管理,就是enqueue resource。
enqueue是有名字的,其名字就是對應的lock的類型加上ID1,ID2參數構成,形如<TYPE-ID1-ID2>。Enqueue resource的結構,其頭部是該enqueue的名字,然后就是指向三個隊列的指針。
通過v$resource視圖可以查看當前系統中的enqueue。
由于系統中有很多類型的lock同時存在,那么enqueue resource結構實際上是一個數組,其長度由隱含參數_enqueue_resources控制,也就是說,該參數控制了系統中可同時存在的lock的數量。如果超過,則會報以下錯誤:
ORA-00052: "maximum number of enqueue resources exceeded"
通過v$resource_limit視圖可以查看系統中各種資源的利用情況。
什么是enqueue lock
enqueue lock就是lock本身。oracle使用了和enqueue reouserce分離的另外一個數組來管理enqueue lock,這個數組的長度由隱含參數_enqueue_locks控制。
通過視圖v$enqueue_lock可以查看該數組中的具體內容。
什么是enqueue hash
通過上面關于enqueue resource的描述,我們可以知道,oracle查找一個lock時,需要先在enqueue resource數上查找到該lock的位置。
如果每次都在數組上順序查找,顯然效率較低。我們知道hash是一種高效的查找算法,所以oracle對于enqueue resource的查找也采用了hash方式,引入了一個hash數組,其大小由隱含參數_enqueue_hash控制。
通過對enqueue的名字<TYPE-ID1-ID2>進行hash計算,得到的結果就是某個enqueue resource在hash數組中的位置,也就是定位到了具體的hash bucket。如果多個enqueue resource的hash值相同,則在同一個bucket中形成一個鏈表。
相應的,為了保護這個hash數組,需要引入一個latch:enqueue hash chain。該latch有若干個子latch,由隱含參數_enqueue_hash_chain_latches控制
什么是enqueue freelist
同樣的,對于enqueue resource數組中的空閑位置,需要通過一個freelist列表來管理,這樣每次在請求新的位置時,不至于要掃描整個數組。enqueue freelist由enqueues latch的保護。
實際上,enqueue resource的Hash管理方式,和buffer cache/library cache的管理方式非常的相像。如果想更深入的了解enqueue hash,resource和lock,可以dump出具體的結果看看:
alter session set events ’immediate trace name enqueues level 3’;
Enqueue
Enqueue 這個詞其實是lock 的另一種描述語。
當我們在AWR 報告中發現長時間的enqueue 等待事件時,說明數據庫中出現了阻塞和等待,可以關聯AWR報告中的enqueue activity部分來確定是哪一種鎖定出現了長時間等待。
這個等待事件有2個參數:
Name: enqueue 的名稱和類型。
Mode: enqueue的模式。
可以使用如下SQL 查看當前會話等待的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等待事件怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。