ENQUEUE總結筆記
總結筆記
Oracle鎖的型別
n 資料字典鎖(DDL)
n 資料操作鎖(DML)
n 內部鎖和閂
n 分散式鎖
n 並行快取管理鎖
佇列是一個服務,是由kernel Service Enqueues (KSQ)層來提供。其他層在使用的是呼叫這個層的函式來使用。佇列是一種用來管理共享資源聯絡的機制。是一個本地的能夠序列連線共享資源的鎖。這些共享資源可以使重做執行緒,表和事務。這種管理方式可以在一個例項上使用,也可以在所有的例項上實現。
在佇列的使用中,有請求,轉換和釋放佇列的使用方式和過程。如果這個佇列不能立即被使用的話,客戶層將選擇等待或者超時。
佇列標識
每一個佇列都有一個唯一的名字來進行標識,這個也可以認為是鎖或者資源的名字。標識由三部分構成:
Type:是一個兩個位元組的字串,例如:TM。
ID12:是一個4位元組的正值。
不同型別的佇列服務ID12是由不同的定義。這些資料可以透過查詢檢視v$lock來檢視到:
SQL> select type,id1,id2 from v$lock; TYPE ID1 ID2 ---- ---------- ---------- MR 202 0 MR 8 0 MR 5 0 MR 4 0 MR 3 0 MR 1 0 RT 1 0 XR 4 0 TS 2 1 9 rows selected |
佇列模式
例如對於DML鎖來說: SS = Row Share (lock a row in shared mode) SX = Row Exclusive (lock a row in exclusive mode) S = Share (lock the entire table in shared mode) SSX = Share Row Exclusive (lock the table in shared mode but a row in exclusive) X = Exclusive (lock the entire table in exclusive mode) SS = 行鎖(在共享模式下鎖一行) SX = 行排他鎖(在排他模式下鎖一行) S = 共享(在共享模式下鎖一個表) SSX = 共享行排他(在共享模式下鎖一個表但是一個行是排他的) X = 排他(整個表在排他模式下鎖) |
佇列的相容性
如下表所示,這裡主要是為了下一步的佇列的請求,轉換和釋放提供一個參考。
Held/Get | NULL | SS | SX | S | SSX | X |
NULL | √ | √ | √ | √ | √ | √ |
SS | √ | √ | √ | √ | √ | |
SX | √ | √ | √ | |||
S | √ | √ | √ | |||
SSX | √ | √ | ||||
X | √ |
佇列的請求,轉換和釋放是有會話來控制的,並不是一個程式,這一定是很好理解的,事務是在會話的基礎之上的。對於每一個佇列是一個資源結構,主要包含和維護著擁有者,等待,轉換的一個列表。而每一個擁有者,等待,轉換都有一個鎖結構。
鎖和資源表被分配在SGA中,在資源表中的總的行數是由初始化引數enqueue_resources來確定。這些行能夠在表x$ksqrs中看到,使用的值可以查詢v$resource。
enqueue_resources這個引數是設定能夠被鎖管理器並行鎖的資源的數量。
_enqueue_locks 這個引數是在佇列鎖表中所有行數,可以在x$ksqeq中查詢到,v$enqueue_lock.
SQL> select * from x$ksqrs; ADDR INDX INST_ID KSQRSID1 KSQRSID2 KSQRSIDT KSQRSFLG -------- ---------- ---------- ---------- ---------- -------- ---------- 7A2DDA38 0 1 1245220 8 TX 4 7A2DDA8C 1 1 0 1 IS 0 7A2DDAE0 2 1 0 0 IS 0 7A2DDB34 3 1 4 0 XR 2 7A2DDB88 4 1 0 0 CF 0 7A2DDBDC 5 1 0 4 CF 0 7A2DDC30 6 1 2033875140 2033875140 CU 0 7A2DDC84 7 1 2033703204 2033703204 CU 0 SQL> select * from v$resource; ADDR TYPE ID1 ID2 -------- ---- ---------- ---------- 7A2DDB34 XR 4 0 7A2DDD2C RT 1 0 7A2DDE28 MR 3 0 7A2DDE7C MR 5 0 7A2DE020 MR 1 0 7A2DE074 MR 4 0 7A2DE0C8 MR 8 0 7A2DE170 MR 202 0 7A2DF2A0 TA 6 9 7A2DFE80 TS 2 1 |
資源結構:
如上圖所示:這個資源結構包含著資源名和三個連線列表,擁有列表包含對這個資源已經請求得到的鎖的會話的鎖結構,等待列表包含著沒有在這個資源上的鎖,但是正在請求的鎖結構。
佇列的分類
佇列有兩個不同的型別:
客戶佇列
鎖結構是由客戶層分配,例如DML鎖(TM)。
管理佇列
鎖結構是由KSQ自身分配。例如:媒介恢復佇列(MR)
這兩種佇列的不同主要是鎖資料結構的位置不同。管理佇列一般由固定或者限制數量的鎖組成。下表就是詳細分類:
Client or User Enqueues TM: DML enqueue TX: Transaction enqueue UL: User supplied Managed or System Enqueues BL: Buffer Cache Management CF: Controlfile Transaction CI: Cross-instance Call Invocation CU: Bind Enqueue DF: Datafile DL: Direct Loader Index Creation DM: Database Mount DR: Distributed Recovery DX: Distributed TX FS: File Set IN: Instance Number IR: Instance Recovery IS: Instance State IV: Library Cache Invalidation JQ: Job Queue KK: Redo Log “Kick” L[A–P]: Library Cache Lock MR: Media Recovery N[A–Z]: Library Cache Pin PF: Password File PI: Parallel Slaves PR: Process Startup PS: Parallel Execution Process Synchronization Q[A–Z]: Row Cache RT: Redo Thread SC: System Commit Number SM: SMON SQ: Sequence Number Enqueue SR: Synchronized Replication SS: Sort Segment ST: Space Management Transaction SV: Sequence Number Value TA: Transaction Recovery TS: Temporary Segment (also TableSpace) TT: Temporary Table UN: User Name US: Undo Segment, Serialization WL: Being Written Redo Log XA: Instance Attribute Lock XI: Instance Registration Lock |
狀態物件
所有的鎖結構被嵌入一個狀態物件,目的是在程式失效的時候允許PMON來恢復這個鎖結構。客戶鎖結構被嵌入客戶化的狀態物件,例如:
1、 DML鎖(TM)結構被嵌入DML鎖狀態物件。
2、 事務鎖結構(TX)被嵌入事務鎖狀態物件。
管理鎖結構被嵌入了佇列狀態物件。
所有的資源結構組成了資源表,為了在資源表中找到相應的資源,Oracle在這裡使用的是一種hash演算法。就是利用資源名(
這個hash鏈是由一個或者多個latches來維護的(enqueue hash chains的子閂),是由round-robin來分配。
鎖的請求
鎖的請求是在會話準備獲取一個鎖但是沒有得到的時候發生。一個會話在一下的狀態上允許得到一個鎖:
1、 在這個地前面沒有需要轉換或者等待的
2、 這個請求的模式&現在已經獲得鎖的會話的模式相容的話,就可以得到這個鎖
不符合上述的話,會話請求將會在等待佇列中等待
請求的詳細步驟:
1、 使用hash函式來確定請求資源的連線列表的位置
2、 獲得相應的enqueue hash chain閂
3、 定位資源,或者如果資源不存在的話,查詢空閒的資源結構並將他放置在這個連線列表上。
4、 獲得enqueues閂;
5、 提供空閒的鎖結構;
6、 使用你所請求的資源正確的資訊來組裝
7、 連線鎖結構到資源結構上
8、 釋放enqueues閂
9、 釋放enqueue hash chain閂
鎖轉換
鎖轉換髮生在一個會話請求改變當前保持的狀態。在下面的情況下允許轉換一個鎖:
1、 需要轉換的狀態是已經保持狀態的子集模式
2、 需要轉換的狀態和被其他會話當前正在保持的狀態相容;
鎖的釋放
釋放的詳細步驟:
1、 使用hash函式來確定請求資源的連線列表的位置
2、 獲得相應的enqueue hash chain閂
3、 定位資源
4、 獲得enqueues閂
5、 解除資源上的鎖結構的連線
6、 連線鎖結構到鎖空閒列表上
7、 釋放enqueues閂
8、 執行下一個轉換或者等待得鎖結構
9、 如果可能的話將資源結構從hash鏈上脫離連線,將這個資源結構連線到資源空閒列表上。
10、 釋放enqueue hash chain閂
從上面的操作來看,有這麼幾個資料結構:
n Hash bucket
n 資源結構
n 鎖結構
相對應的有幾個列表:
n Hash 列表
主要是為了連線hash bucket
n 資源結構空閒列表
這裡存在這樣的一個列表,可以使用資源的使用和釋放,這個應該是用某一個初始化引數來決定資源的數量。在資源表中的總的行數是由初始化引數enqueue_resources來確定。這些行能夠在表x$ksqrs中看到,使用的值可以查詢v$resource。
enqueue_resources這個引數是設定能夠被鎖管理器並行鎖的資源的數量。
n 鎖結構空閒列表
這個空閒列表示用於鎖結構資源的使用&釋放。_enqueue_locks 這個引數是在佇列鎖表中所有行數,可以在x$ksqeq中查詢到,v$enqueue_lock.
佇列的操作
1、 在一個新的鎖被請求的時候,Oracle伺服器將檢查驗證這個佇列,看看這個請求是否被授權。
2、 當一個鎖被釋放或者被轉換的時候,轉換器和等待器也被重新檢查,來看看他們是否能被請求。
3、 轉換器佇列首先被處理,隨後是等待佇列。
等待事件:enqueue
當一個會話等待一個本地佇列的時候,將會找到佇列等待時間的產生。我們可以透過查詢檢視v$session_wait來發現這個等待時間。
select event, total_waits, total_timeouts from v$system_event where event = 'enqueue'; |
調整佇列等
1、調整enqueue等待事件依賴於造成等待enqueue的型別;調整enqueue等待事件很大程度上是依賴於造成等待enqueue的型別。
2、可能的解決辦法為:
a 減少enqueue的請求量
例如SQ佇列主要原因是由於sequence有關,如果在記憶體中被請求的序列有幾個值得話,就可以從一定程度上緩解這種佇列的產生。所以解決的方法是透過增加序列的快取。再如ST佇列實有關於字典表空間管理方式下,空間事務的請求有關,這樣的解決方式就是我們可以透過將空間轉換為本地管理表空間,減少衝突的產生等情況來解決。
b 減少enqueue保持的時間
例如CF佇列必須是在更新控制檔案時候必須被保持的狀態,主要原因是有太多的控制檔案的複製,更新他們就需要太多的保持enqueue的時間,解決的辦法是減少控制檔案的數目。
診斷佇列的指令碼:
prompt *************************************************************************** prompt enqueue的調查和分析 prompt *************************************************************************** prompt 建議: prompt 1、調整enqueue等待事件依賴於造成等待enqueue的型別; prompt 2、可能的解決辦法為: prompt a 減少enqueue的請求量 prompt b 減少enqueue保持的時間 prompt TM: DML enqueue prompt TX: Transaction enqueue prompt UL: User supplied prompt prompt BL: Buffer Cache Management prompt CF: Controlfile Transaction prompt CI: Cross-instance Call Invocation prompt CU: Bind Enqueue prompt DF: Datafile prompt DL: Direct Loader Index Creation prompt DM: Database Mount prompt DR: Distributed Recovery prompt DX: Distributed TX prompt FS: File Set prompt IN: Instance Number prompt IR: Instance Recovery prompt IS: Instance State prompt IV: Library Cache Invalidation prompt JQ: Job Queue prompt KK: Redo Log “Kick” prompt L[A–P]: Library Cache Lock prompt MR: Media Recovery prompt N[A–Z]: Library Cache Pin prompt PF: Password File prompt PI: Parallel Slaves prompt PR: Process Startup prompt PS: Parallel Execution Process Synchronization prompt Q[A–Z]: Row Cache prompt RT: Redo Thread prompt SC: System Commit Number prompt SM: SMON prompt SQ: Sequence Number Enqueue prompt SR: Synchronized Replication prompt SS: Sort Segment prompt ST: Space Management Transaction prompt SV: Sequence Number Value prompt TA: Transaction Recovery prompt TS: Temporary Segment (also TableSpace) prompt TT: Temporary Table prompt UN: User Name prompt US: Undo Segment, Serialization
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/222350/viewspace-908008/,如需轉載,請註明出處,否則將追究法律責任。
上一篇:
DELETE大批次資料的效能最佳化
下一篇:
鎖的總結筆記
請登入後發表評論
登入
全部評論
最新文章
|
相關文章
- kvm筆記總結筆記
- Mybatis筆記總結MyBatis筆記
- mysql總結筆記 -- 索引篇MySql筆記索引
- 天氣小程式筆記總結筆記
- Python筆記_1語法總結Python筆記
- Redis知識點筆記總結Redis筆記
- Docker快速入門總結筆記Docker筆記
- 探索性測試總結筆記筆記
- 階段性總結_學習筆記筆記
- console常用命令總結筆記筆記
- JS常用陣列方法總結筆記JS陣列筆記
- MySQL-覆蓋索引總結筆記MySql索引筆記
- 如何正確做筆記?符號筆記法、康奈爾筆記法總結!筆記符號
- 《程式碼整潔之道》總結和筆記筆記
- Spring Cloud微服務複習筆記總結SpringCloud微服務筆記
- 終、《圖解HTTP》讀書筆記 - 彙總篇(總結)圖解HTTP筆記
- vue+element UI 學習總結筆記(一)VueUI筆記
- git status 命令總結 —— Git 學習筆記 06Git筆記
- SciTech-Mathematics-數學專業筆記總結筆記
- Django筆記十七之group by 分組用法總結Django筆記
- 一個DBA總結的MySQL學習筆記MySql筆記
- Oracle Enqueue WaitsOracleENQAI
- oracle enqueue(zt)OracleENQ
- oracle enqueue typeOracleENQ
- 筆記:React 中關於 key 的一點總結筆記React
- Vue.js中前端知識點總結筆記Vue.js前端筆記
- 複習第二天總結筆記3.19筆記
- 3. 檔案上傳漏洞——漏洞總結筆記筆記
- What is the "WF - Contention'' Enqueue ?ENQ
- kotlin學習筆記-異常好玩的list集合總結Kotlin筆記
- 人工智慧實踐:Tensorflow筆記:程式碼總結(2)人工智慧筆記
- cmu15545筆記-併發控制總結(Concurrency Control Summary)筆記
- 39.Redis總結 嘻哈的簡寫筆記——RedisRedis筆記
- 《演算法筆記》6. 連結串列相關面試題總結演算法筆記面試題
- Web前端學習筆記之前端跨域知識總結Web前端筆記跨域
- 安全雜亂筆記整理1---常用服務埠總結筆記
- MongoDB University筆記總結-M001_Chapter 5: Indexing and Aggregation PipelineMongoDB筆記APTIndex
- CANopen學習筆記(總)筆記
- (資料結構程式碼,總結,自我思考)=> { return 個人學習筆記; } 【To be continued~】資料結構筆記