對Oracle cursor的理解
對Oracle cursor的理解
這篇文章所說的cursor不是pl/sql中的cursor,不要搞混了哦。
人們常說是SQL在影響了資料庫,更準確的說法是cursor在影響資料庫。
Oracle中的cursor分為parent cursor,child cursor。
parent cursor只是純粹的SQL文字,對應的動態效能檢視為v$sqlarea,每一條記錄就是一條cursor,都有唯一的sql_id。
child cursor是parent cursor的子類,儲存了根據optimizer mode,傳入值,索引等的不同生成不同的執行計劃。所以optimizer mode,傳入值,查詢的資料的不同就有可能導致cursor不能共享。就會出現同一個parent cursor存在多個child cursor。child cursor對應的動態效能檢視為v$sql。同樣一個parent cursor可能存在多個child cursor,每一個child cursor叫做parent cursor的一個version。所以有v$sqlarea.version_count,記錄的就是parent cursor有多少個child cursor。在相關的AWR報告中,也有對version個數的排序的統計,如果一個parent cursor的version太多,可以透過查詢v$sql_shared_cursor來查詢沒有共享同一個cursor遊標的原因,能夠共享同一個child cursor是我們最好的。
v$sqlarea是v$sql的一個聚合值。
fetchs,exectuions,buffer_gets,disk_reads在v$sqlarea和v$sql檢視中都存在,但是v$sqlarea是它所有v$sql cursor的累計值。
v$sql中有個欄位叫child_number,如果為0表示是父cursor生成的第一個子cursor,1,2,3以此類推。
address表示在shared pool中的記憶體地址,hash_value表示該SQL生成ascii碼,然後經過一個hash演算法後的值,對應到library cache中的具體的一個bucket。v$sql中的address,hash_value,sql_id表示的父cursor的資訊,child_address,child_hash_value,child_sql_id才表示的是自己的cursor資訊。
我們在對效能調優時,經常可以透過group by v$sqlarea.buffer_gets,v$sqlarea.disk_reads來找出影響效能的SQL語句。
當一條SQL第一次被客戶端傳送給伺服器時,首先會將此SQL轉化成ascii碼,然後透過固定的演算法算出它的一個hash值,然後請求shared pool latch為其在library cache中分配一個儲存空間,釋放shared pool latch,請求library cache latch將其寫入library cache中相應的bucket。在這個過程中會生成parent cursor和child cursor。當類似的SQL再次傳送到伺服器時,會生成相應的hash值,請求library cache latch然後去掃描bucket,如果找到能夠共享的child cursor,就共享此child cursor,這一過程稱為軟解析,如果未能掃描到能夠共享的cursor,那麼會重複上面的操作,請求空間,生成一個新的child cursor,這個過程稱為硬解析。更快的情況是,該sql能夠在session cache cursor中找到能夠共享的cursor,那就最好不過了,這個過程叫做快速軟解析,是最先進行的步驟。如果一個cursor被共享達到3次就會被放到session cache cursor的行列中,下一次在出現類似的cursor就能夠最快的實現共享。
影響cursor的系統引數有:
sharing_cursor=exact|similar|force
http://space.itpub.net/23135684/viewspace-629457
open_cursors
http://space.itpub.net/23135684/viewspace-626712
session_cached_cursors
http://space.itpub.net/23135684/viewspace-626972
--有待完善--
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23135684/viewspace-660663/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 說下你對cursor屬性的理解
- Oracle CursorOracle
- 【CURSOR】Oracle 遊標 (cursor)知識梳理Oracle
- Oracle:cursor:mutex XOracleMutex
- 對oracle分割槽表的理解整理Oracle
- 【CURSOR】Oracle繫結變數、執行計劃對遊標的影響Oracle變數
- 【CURSOR】Oracle 子游標無法共享的原因之V$SQL_SHARED_CURSOROracleSQL
- oracle等待事件之cursor:pin S wait on XOracle事件AI
- ORACLE中Cursor_sharing引數詳解Oracle
- Difference between cursor and a ref cursor
- Postgresql的CURSOR SHARINGSQL
- Oracle資料庫之cursor、refcursor及sys_refcursor深度解析Oracle資料庫
- oracle資料庫%notfound的理解Oracle資料庫
- 對於BFC的理解
- 對於MVVM的理解MVVM
- 對VUE框架的理解Vue框架
- 我對抽象的理解抽象
- 對事務的理解
- Cursor使用
- 使用 OPEN CURSOR 和 FETCH NEXT CURSOR 對 SAP 資料庫表進行分塊讀寫試讀版資料庫
- 簡述對Vuex的理解Vue
- 對javascript閉包的理解JavaScript
- 對Vue插槽slot的理解Vue
- 程式中,對鎖的理解
- 1. 對Vue的理解Vue
- 對JS閉包的理解JS
- 對hadoop之RPC的理解HadoopRPC
- 對於button元素的理解
- 對AIDL和Binder的理解AI
- 對session和cookie的理解SessionCookie
- 對預編譯的理解編譯
- 自己對分頁的理解
- 我對JavaScript物件的理解JavaScript物件
- 說說你對this的理解
- 關於對Host的理解
- 對前端“價值”的理解前端
- 對Java異常的理解Java
- 對Innodb中MVCC的理解MVC
- 對CSRF的簡單理解