[20180813]重新整理共享池與父子遊标.txt
--//測試重新整理共享池與父子遊标含有那些資訊儲存在共享池.
--//自己最近遇到的問題,感覺自己以前了解有點亂,測試看看.
1.環境
SCOTT@book> @ ver1
PORT_STRING VERSION BANNER
------------------- ---------- ----------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
2.測試:
--//session 1:
select * from dept where deptno=10;
--//确定sql_id=4xamnunv51w9j,可以查詢v$sql視圖确定.
--//session 2:
SYS@book> @ &r/sharepool/shp4 4xamnunv51w9j 0
TEXT KGLHDADR KGLHDPAR C40 KGLHDLMD KGLHDPMD KGLOBHD0 KGLOBHD6 KGLOBHS0 KGLOBHS6 KGLOBT16 N0_6_16 N20 KGLNAHSH KGLOBT03 KGLOBT09
-------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
子遊标句柄位址 000000007D9134A0 000000007D7110E0 select * from dept where deptno=10 1 0 000000007D6F2250 000000007BFF1138 4488 12144 3067 19699 19699 911274289 4xamnunv51w9j 0
父遊标句柄位址 000000007D7110E0 000000007D7110E0 select * from dept where deptno=10 1 0 000000007D9E7608 00 4720 0 0 4720 4720 911274289 4xamnunv51w9j 65535
--//全部父子光标,父堆0.子堆0,6都在.KGLHDLMD=1.目前session 1,執行完該條語句,11g下遊标不會釋放.
SYS@book> alter system flush shared_pool;
System altered.
子遊标句柄位址 000000007D9134A0 000000007D7110E0 select * from dept where deptno=10 1 0 00 00 0 0 3067 3067 3067 911274289 4xamnunv51w9j 0
--//父子遊标,父遊标堆0,子遊标都沒有清除.并且KGLHDLMD=1
--//子遊标堆0,子遊标堆6清除.
--//目前執行的語句,遊标不會關閉,重新整理共享池,并不能父子遊标,父遊标堆0,子遊标.
--//是否可以這麼了解KGLHDLMD=1的情況下,不會清除全部資訊.
SCOTT@book> select sysdate from dual;
SYSDATE
-------------------
2018-08-14 09:00:11
no rows selected
--//可以發現光标已經全部清除.因為session 1目前執行的是 select sysdate from dual;.
--//sql_id=4xamnunv51w9j的遊标已經關閉.這樣重新整理共享池,可以完全清除.
--//忘記在重新整理前看看遊标的情況,補充測試3.
3.測試:
select sysdate from dual;
--//注意目前語句不是select * from dept where deptno=10;.
子遊标句柄位址 000000007D8A5B98 000000007DB3C798 select * from dept where deptno=10 0 0 000000007D72DD88 000000007C9A8358 4520 12144 3067 19731 19731 911274289 4xamnunv51w9j 0
父遊标句柄位址 000000007DB3C798 000000007DB3C798 select * from dept where deptno=10 0 0 000000007DAFF9F0 00 4720 0 0 4720 4720 911274289 4xamnunv51w9j 65535
--//全部父子光标,父堆0.子堆0,6都在.KGLHDLMD=0.
4.測試:
--//測試會話緩存光标的情況.
SCOTT@book> show parameter session_cached_cursors
NAME TYPE VALUE
---------------------- ------- -----
session_cached_cursors integer 50
--//執行3次以上,注意最後一條語句是select sysdate from dual;
子遊标句柄位址 000000007D4BB278 000000007D4BB608 select * from dept where deptno=10 1 0 000000007D4BB1C0 000000007BA63988 4528 12144 3067 19739 19739 911274289 4xamnunv51w9j 0
父遊标句柄位址 000000007D4BB608 000000007D4BB608 select * from dept where deptno=10 1 0 000000007D4BF948 00 4720 0 0 4720 4720 911274289 4xamnunv51w9j 65535
--//執行3次以後,KGLHDLMD=1.
--//你可以在每次執行select sysdate from dual;檢視sql_id=4xamnunv51w9j光标情況.
--//僅僅第3次後KGLHDLMD=1.
子遊标句柄位址 000000007D4BB278 000000007D4BB608 select * from dept where deptno=10 1 0 00 00 0 0 3067 3067 3067 911274289 4xamnunv51w9j 0
--//目前執行的語句不是該條,但是當會話緩存遊标以後,重新整理共享池,并不能清除父子遊标,父遊标堆0,子遊标.
--//也就是重新整理共享池無法完全清除會話緩存的光标.
--//附上shp4.sql腳本:
$ cat sharepool/shp4.sql
column N0_6_16 format 99999999
SELECT DECODE (kglhdadr,
kglhdpar, '父遊标句柄位址',
'子遊标句柄位址')
text,
kglhdadr,
kglhdpar,
substr(kglnaobj,1,40) c40,
KGLHDLMD,
KGLHDPMD,
-- kglhdivc,
kglobhd0,
kglobhd6,
kglobhs0,kglobhs6,kglobt16,
kglobhs0+kglobhs6+kglobt16 N0_6_16,
kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6+kglobt16 N20,
kglnahsh,
kglobt03 ,
kglobt09
FROM x$kglob
WHERE kglobt03 = '&1' or kglhdpar='&1' or kglhdadr='&1' or KGLNAHSH= &2;