天天看點

[20180813]重新整理共享池與父子遊标.txt

[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;