對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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle一些引數的理解 cursor_sharingOracle
- 對ORACLE SCN的理解Oracle
- 理解V$OPEN_CURSOR,SESSION_CACHED_CURSORSession
- Oracle CursorOracle
- Cursor語法及理解
- 理解V$OPEN_CURSOR, V$SESSION_CACHED_CURSORSession
- [zt] 理解V$OPEN_CURSOR, V$SESSION_CACHED_CURSORSession
- 【CURSOR】Oracle 遊標 (cursor)知識梳理Oracle
- Oracle:cursor:mutex XOracleMutex
- 對oracle分割槽表的理解整理Oracle
- Oracle 的 cursor_sharing引數Oracle
- 對 oracle 資料庫日期格式,以及對日期操作的理解Oracle資料庫
- 對於Oracle資料字典的深入理解Oracle
- oracle plsql(三)_type_cursorOracleSQL
- oracle cursor_sharing [轉]Oracle
- oracle中cursor的使用經典資料Oracle
- 【CURSOR】Oracle繫結變數、執行計劃對遊標的影響Oracle變數
- 【DBA】Oracle 11g 針對SQL效能的新特性(一)- Adaptive Cursor SharingOracleSQLAPT
- 【CURSOR】Oracle 子游標無法共享的原因之V$SQL_SHARED_CURSOROracleSQL
- 學習Oracle核心(cursor: pin S)Oracle
- Oracle使用cursor for隱式遊標Oracle
- oracle引數-cursor_sharingOracle
- 對 REST 的理解REST
- 對rose 的理解ROS
- 對Join的理解
- oracle cursor遊標獲取首末元素Oracle
- Cursor Sharing in Oracle Database 11gOracleDatabase
- Oracle Shared Cursor問題的幾個實驗Oracle
- 對Oracle資料庫中Stroage子句的一些理解Oracle資料庫
- 我對抽象的理解抽象
- 對於BFC的理解
- 對事務的理解
- 對於MVVM的理解MVVM
- 對VUE框架的理解Vue框架
- 我對引擎的理解
- 對測試的理解
- 對CustomHTTPProtocol的理解HTTPProtocol
- 自己對Binder的理解