理解V$OPEN_CURSOR, V$SESSION_CACHED_CURSOR
這兩個概念很容易混淆。[@more@]概念:
OPEN_CURSOR,定義每個Session最大能夠開啟的遊標數量。在init.ora檔案中定義,可以透過select * from v$parameter where name = 'open_cursors'查詢。
V$OPEN_CURSOR,當前Session快取的遊標,而不是曾經開啟的遊標。 V$SESSION_CACHED_CURSOR,當前Session已經關閉並被快取的遊標。
V$OPEN_CURSOR中顯示的當前Session遊標快取中游標,如果要精確查詢當前Session開啟的遊標總數,需要從V$ SESSTAT中查詢。
Session Cache的原理:
當設定SESSION_CACHED_CURSOR的值之後,當有parse請求的時候,Oracle會從library cache中查詢。如果有超過3次同樣的parse請求,這個遊標將會存入Session的遊標快取中。對於將來同樣的查詢,就甚至不要soft parse,直接從Session的遊標快取中取。
驗證:
登入兩個SQL*PLUS客戶端,分別為Session test和Session monitor。
1. 檢查是否引數設定,以及執行的SQL語句是否在V$OPEN_CURSOR找到。
透過如上的執行結果可以知道,當前引數設定session_cached_cursors的值為0,不快取當前Session關閉的遊標。當前Session的ID為9。
Session Monitor: SQL> SELECT SID, n.NAME para_name, s.VALUE used
2 FROM SYS.v_$statname n, SYS.v_$sesstat s
3 WHERE n.NAME IN ('opened cursors current', 'session cursor cache count')
4 AND s.statistic# = n.statistic# 5 AND SID = 9;
SID PARA_NAME USED
--- ------------------------------ ----------
9 opened cursors current 1
9 session cursor cache count 0
SQL> select SID, USER_NAME,SQL_TEXT from v$open_cursor where sid=9;
SID USER_NAME SQL_TEXT
--- ---------- -----------------------------------------------------------
9 SCOTT select sid from v$mystat where rownum=1
透過如上的執行結果可以知道,當前在V$OPEN_CURSOR儲存一個遊標,對應SQL為Session Test執行的最後一條語句。V$SESSION_CACHED_CURSOR沒有儲存遊標。
2. 更改引數V$SESSION_CACHED_CURSOR值。
Session Test:
SQL> alter session set session_cached_cursors = 1;
Session altered.
SQL> show parameter session_cached_cursors;
NAME TYPE VALUE
------------------------------------ ----------- -------------------------
session_cached_cursors integer 1
3. 驗證如下結論。如果遊標被存入SESSION_CACHED_CURSOR,前提是遊標已經關閉,遊標對應的SQL被執行3次以上。OPEN_CURSOR中會儲存儲存在SESSION_CACHED_CURSOR以及開啟的遊標(不是精確值)。
Session Test:
SQL> select sid from v$mystat where rownum =1;
SID
----------
9
SQL> select sid from v$mystat where rownum =1;
SID
----------
9
SQL> select sid from v$mystat where rownum =1;
SID
----------
9
Session Monitor:
SQL> select SID, USER_NAME,SQL_TEXT from v$open_cursor where sid=9;
SID USER_NAME SQL_TEXT
--- ---------- -----------------------------------------------------------
9 SCOTT select sid from v$mystat where rownum =1
SQL> SELECT SID, n.NAME para_name, s.VALUE used
2 FROM SYS.v_$statname n, SYS.v_$sesstat s
3 WHERE n.NAME IN ('opened cursors current', 'session cursor cache count')
4 AND s.statistic# = n.statistic#
5 AND SID = 9;
SID PARA_NAME USED
--- ------------------------------ ----------
9 opened cursors current 1
9 session cursor cache count 0
v$open_cursor dooes not show all open cursors. it shows more than that, the best option to find the number of open cursors is from v$sysstat. 透過如上的執行結果可以知道,即使同一個遊標被開啟3次,在SESSION_CACHED_CURSOR的數量仍然為0。
下面,將會在Session Test中關閉遊標(透過執行一條其他的語句)。
Session Test: SQL> select * from t where rownum!=7;
no rows selected
Session Monitor:
SQL> SELECT SID, n.NAME para_name, s.VALUE used
2 FROM SYS.v_$statname n, SYS.v_$sesstat s
3 WHERE n.NAME IN ('opened cursors current', 'session cursor cache count')
4 AND s.statistic# = n.statistic#
5 AND SID = 9;
SID PARA_NAME USED
--- ------------------------------ ----------
9 opened cursors current 1
9 session cursor cache count 1
SQL> select SID, USER_NAME,SQL_TEXT from v$open_cursor where sid=9;
SID USER_NAME SQL_TEXT
--- ---------- -----------------------------------------------------------
9 SCOTT select sid from v$mystat where rownum=1
9 SCOTT select * from t where rownum!=7
透過如上的執行結果可以知道,遊標被開啟3次之後,如果這個遊標關閉之後,遊標會被儲存到SESSION_CACHED_CURSOR當中。同時,透過OPEN_CURSOR中顯示的SQL可以得知,OPEN_CURSOR中會儲存儲存在SESSION_CACHED_CURSOR以及開啟的遊標(不是精確值)。
其他:SESSION_CACHED_CURSOR採用的是LRU演算法,如果如果有新的遊標需要快取,而當前遊標快取已經滿,最少使用的遊標將會被清除出去。調整SESSION_CACHED_CURSOR引數。透過如下SQL得到從快取中取遊標以及取PARSE的數量,為調整作參考。
select cach.value cache_hits, prs.value all_parses,
prs.value-cach.value sess_cur_cache_not_used
from v$sesstat cach, v$sesstat prs,
v$statname nm1, v$statname nm2
where cach.statistic# = nm1.statistic# and
nm1.name = 'session cursor cache hits' and
prs.statistic#=nm2.statistic# and
nm2.name= 'parse count (total)' and
cach.sid= &sid and prs.sid= cach.sid ;
參考:
1.Monitoring Open and Cached Cursors
2.session_cached_cursor
OPEN_CURSOR,定義每個Session最大能夠開啟的遊標數量。在init.ora檔案中定義,可以透過select * from v$parameter where name = 'open_cursors'查詢。
V$OPEN_CURSOR,當前Session快取的遊標,而不是曾經開啟的遊標。 V$SESSION_CACHED_CURSOR,當前Session已經關閉並被快取的遊標。
V$OPEN_CURSOR中顯示的當前Session遊標快取中游標,如果要精確查詢當前Session開啟的遊標總數,需要從V$ SESSTAT中查詢。
select a.value,
s.username,
s.sid,
s.serial#
from
v$sesstat a,
v$statname b,
v$session s
where
a.statistic# = b.statistic# and
s.sid=a.sid and
b.name = 'opened cursors current';
s.username,
s.sid,
s.serial#
from
v$sesstat a,
v$statname b,
v$session s
where
a.statistic# = b.statistic# and
s.sid=a.sid and
b.name = 'opened cursors current';
Session Cache的原理:
當設定SESSION_CACHED_CURSOR的值之後,當有parse請求的時候,Oracle會從library cache中查詢。如果有超過3次同樣的parse請求,這個遊標將會存入Session的遊標快取中。對於將來同樣的查詢,就甚至不要soft parse,直接從Session的遊標快取中取。
驗證:
登入兩個SQL*PLUS客戶端,分別為Session test和Session monitor。
1. 檢查是否引數設定,以及執行的SQL語句是否在V$OPEN_CURSOR找到。
Session Test:
SQL> show parameter session_cached_cursors;
NAME TYPE VALUE
------------------------------
session_cached_cursors integer 0
SQL> select sid from v$mystat where rownum=1;
SID
----------
9
SQL> select sid from v$mystat where rownum=1;
SID
----------
9
SQL> show parameter session_cached_cursors;
NAME TYPE VALUE
------------------------------
session_cached_cursors integer 0
SQL> select sid from v$mystat where rownum=1;
SID
----------
9
SQL> select sid from v$mystat where rownum=1;
SID
----------
9
透過如上的執行結果可以知道,當前引數設定session_cached_cursors的值為0,不快取當前Session關閉的遊標。當前Session的ID為9。
Session Monitor: SQL> SELECT SID, n.NAME para_name, s.VALUE used
2 FROM SYS.v_$statname n, SYS.v_$sesstat s
3 WHERE n.NAME IN ('opened cursors current', 'session cursor cache count')
4 AND s.statistic# = n.statistic# 5 AND SID = 9;
SID PARA_NAME USED
--- ------------------------------ ----------
9 opened cursors current 1
9 session cursor cache count 0
SQL> select SID, USER_NAME,SQL_TEXT from v$open_cursor where sid=9;
SID USER_NAME SQL_TEXT
--- ---------- -----------------------------------------------------------
9 SCOTT select sid from v$mystat where rownum=1
透過如上的執行結果可以知道,當前在V$OPEN_CURSOR儲存一個遊標,對應SQL為Session Test執行的最後一條語句。V$SESSION_CACHED_CURSOR沒有儲存遊標。
2. 更改引數V$SESSION_CACHED_CURSOR值。
Session Test:
SQL> alter session set session_cached_cursors = 1;
Session altered.
SQL> show parameter session_cached_cursors;
NAME TYPE VALUE
------------------------------------ ----------- -------------------------
session_cached_cursors integer 1
3. 驗證如下結論。如果遊標被存入SESSION_CACHED_CURSOR,前提是遊標已經關閉,遊標對應的SQL被執行3次以上。OPEN_CURSOR中會儲存儲存在SESSION_CACHED_CURSOR以及開啟的遊標(不是精確值)。
Session Test:
SQL> select sid from v$mystat where rownum =1;
SID
----------
9
SQL> select sid from v$mystat where rownum =1;
SID
----------
9
SQL> select sid from v$mystat where rownum =1;
SID
----------
9
Session Monitor:
SQL> select SID, USER_NAME,SQL_TEXT from v$open_cursor where sid=9;
SID USER_NAME SQL_TEXT
--- ---------- -----------------------------------------------------------
9 SCOTT select sid from v$mystat where rownum =1
SQL> SELECT SID, n.NAME para_name, s.VALUE used
2 FROM SYS.v_$statname n, SYS.v_$sesstat s
3 WHERE n.NAME IN ('opened cursors current', 'session cursor cache count')
4 AND s.statistic# = n.statistic#
5 AND SID = 9;
SID PARA_NAME USED
--- ------------------------------ ----------
9 opened cursors current 1
9 session cursor cache count 0
v$open_cursor dooes not show all open cursors. it shows more than that, the best option to find the number of open cursors is from v$sysstat. 透過如上的執行結果可以知道,即使同一個遊標被開啟3次,在SESSION_CACHED_CURSOR的數量仍然為0。
下面,將會在Session Test中關閉遊標(透過執行一條其他的語句)。
Session Test: SQL> select * from t where rownum!=7;
no rows selected
Session Monitor:
SQL> SELECT SID, n.NAME para_name, s.VALUE used
2 FROM SYS.v_$statname n, SYS.v_$sesstat s
3 WHERE n.NAME IN ('opened cursors current', 'session cursor cache count')
4 AND s.statistic# = n.statistic#
5 AND SID = 9;
SID PARA_NAME USED
--- ------------------------------ ----------
9 opened cursors current 1
9 session cursor cache count 1
SQL> select SID, USER_NAME,SQL_TEXT from v$open_cursor where sid=9;
SID USER_NAME SQL_TEXT
--- ---------- -----------------------------------------------------------
9 SCOTT select sid from v$mystat where rownum=1
9 SCOTT select * from t where rownum!=7
透過如上的執行結果可以知道,遊標被開啟3次之後,如果這個遊標關閉之後,遊標會被儲存到SESSION_CACHED_CURSOR當中。同時,透過OPEN_CURSOR中顯示的SQL可以得知,OPEN_CURSOR中會儲存儲存在SESSION_CACHED_CURSOR以及開啟的遊標(不是精確值)。
其他:SESSION_CACHED_CURSOR採用的是LRU演算法,如果如果有新的遊標需要快取,而當前遊標快取已經滿,最少使用的遊標將會被清除出去。調整SESSION_CACHED_CURSOR引數。透過如下SQL得到從快取中取遊標以及取PARSE的數量,為調整作參考。
select cach.value cache_hits, prs.value all_parses,
prs.value-cach.value sess_cur_cache_not_used
from v$sesstat cach, v$sesstat prs,
v$statname nm1, v$statname nm2
where cach.statistic# = nm1.statistic# and
nm1.name = 'session cursor cache hits' and
prs.statistic#=nm2.statistic# and
nm2.name= 'parse count (total)' and
cach.sid= &sid and prs.sid= cach.sid ;
參考:
1.Monitoring Open and Cached Cursors
2.session_cached_cursor
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/94829/viewspace-918266/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20201207]12c v$open_cursor檢視.txt
- [20200417]跟蹤特定sql語句以及v$open_cursor檢視.txtSQL
- [20200422]跟蹤特定sql語句以及v$open_cursor檢視(補充).txtSQL
- [20200417]跟蹤特定sql語句以及v$open_cursor檢視2.txtSQL
- [20200424]跟蹤特定sql語句以及v$open_cursor檢視(再補充).txtSQL
- 【vue原始碼】深度理解v-forVue原始碼
- 深入理解 V8 的 Call Stack
- 前端【VUE】02-vue指令【v-html 、v-show、 v-if 、v-else、v-on、v-bind、v-for、v-model】前端VueHTML
- v$sql,v$sqlarea,v$sqltext區別SQL
- vue v-text,v-html,v-once,v-pre,v-cloak的使用VueHTML
- vue_o6_v-once、v-html、v-text、v-pre、v-cloak指令的使用VueHTML
- EMQ 文件 V1.0 V2.0 V3.0MQ
- 自定義元件v-model的實質性理解元件
- 我對 React v16.4 生命週期的理解React
- 對epoll機制的學習理解v1
- v-if和v-show
- CANoe C-V2X Demo(V2I+V2V)演示視訊
- 維數定理(手推!):證明dim(v1)+dim(v2) = dim(v1+v2) + dim(v1∩v2)
- 1V升壓3V,1V升壓3.3V晶片,1V升壓5V升壓IC晶片
- v-html 、v-text({{}}) 、v-model的區別HTML
- v
- 1V升3V,1V升3.3V,1V升5V高電流,低功耗升壓晶片晶片
- 24v轉120v,24V轉150v/350v隔離變壓電源模組
- vue 的v-on與v-bindVue
- v-for,v-bink,綜合案例
- Oracle9i中v$sql、v$sqlarea、v$sqltext、v$sql_plan的聯絡與區別OracleSQL
- 1V升5V晶片,1V升5V電路圖規格書晶片
- android之support-v4、v7、v13的區別Android
- v-for
- (精華2020年5月4日更新) vue教程篇 v-text,v-html,v-once,v-pre,v-cloak的使用VueHTML
- Vue v-if以及 v-else 的使用Vue
- v-if和v-show的區別
- React Router從V2/V3到V4的變化React
- [vue] 常見用法之 v-html、v-text、v-model區別VueHTML
- 深入V8引擎-引擎內部類管理解析
- v-if/v-show 條件渲染指令
- ESXI 遷移至KVM (V2V遷移)
- 1V轉5V,1V轉3.3V升壓極大電流晶片,外圍極少晶片
- 12V轉80V/150V/350V電容充電隔離電源升壓模組