對Oracle cursor的理解

尛樣兒發表於2010-04-24

對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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章