[20180819]關於父子游標問題(11g).txt

来源:https://www.cnblogs.com/lfree/archive/2018/08/22/9519903.html
-Advertisement-
Play Games

[20180819]關於父子游標問題(11g).txt--//sql語句存在父子游標,子游標堆6在父游標堆0裡面.--//如果存在許多子游標的情況下,父游標堆0是否大小是發生變化呢.測試看看.--//另外11g引入參數_cursor_obsolete_threshold限制子游標的數量,測試它的一些 ...


[20180819]關於父子游標問題(11g).txt

--//sql語句存在父子游標,子游標堆6在父游標堆0裡面.
--//如果存在許多子游標的情況下,父游標堆0是否大小是發生變化呢.測試看看.
--//另外11g引入參數_cursor_obsolete_threshold限制子游標的數量,測試它的一些控制機制.

1.環境:
--//session 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

SCOTT@book> SELECT count(*) FROM dept WHERE deptno=10;
  COUNT(*)
----------
         1
--//確定sql_id=2xw4k6w7wc5ka.

--//session 2:
SYS@book> @ &r/hide _cursor_obsolete_threshold
NAME                       DESCRIPTION                                    DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE
-------------------------- ---------------------------------------------- ------------- ------------- ------------
_cursor_obsolete_threshold Number of cursors per parent before obsoletion TRUE          1024          1024

--//退出session 1,刷新共用池,清除該語句在共用池.這樣才能清除乾凈.
SYS@book> alter system flush shared_pool;
System altered.

2.建立測試腳本:
$ cat aa.sql
DECLARE
    l_count PLS_INTEGER;
BEGIN
    FOR i IN 1..&&2
    LOOP
    EXECUTE IMMEDIATE 'ALTER SESSION SET optimizer_index_caching = '||i;
    FOR j IN 1..&&1
    LOOP
        EXECUTE IMMEDIATE 'ALTER SESSION SET optimizer_index_cost_adj = '||j;
        EXECUTE IMMEDIATE 'SELECT count(*) FROM dept WHERE deptno=10' into l_count;
    END LOOP;
    END LOOP;
END;
/
--//執行如上腳本,能產生許多子游標.主要是因為環境變數發生了變化.

--//session 1:
SCOTT@book> @ aa.sql 1 64
PL/SQL procedure successfully completed.

3.查看父子游標情況:
--//session 2:
SYS@book> @ &r/sharepool/shp4z 2xw4k6w7wc5ka 0
TEXT           KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
-------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
父游標句柄地址 000000007CBC2C60 000000007CBC2C60 SELECT count(*) FROM dept WHERE deptno=1          1          0 000000007CBC2BA8 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535

--//查看父游標堆0的chunk:
select a.* from x$ksmsp a where a.ksmchpar=hextoraw('000000007CBC2BA8')
ADDR                   INDX    INST_ID   KSMCHIDX   KSMCHDUR KSMCHCOM         KSMCHPTR           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00007F8F6AF85568       1634          1          1          1 KGLH0^fc6164a    000000007DB3C420       4096 freeabl           0 000000007CBC2BA8
00007F8F6AF5A1F8       2515          1          1          1 KGLH0^fc6164a    000000007D879970       4096 freeabl           0 000000007CBC2BA8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00007F8F6AF5EA40       2676          1          1          1 KGLH0^fc6164a    000000007D7C2F20       4096 freeabl           0 000000007CBC2BA8
00007F8F6AF55250       3713          1          1          1 KGLH0^fc6164a    000000007D342488       4096 freeabl           0 000000007CBC2BA8
00007F8F6AF450F0       4407          1          1          1 KGLH0^fc6164a    000000007CE8C5F8       4096 freeabl           0 000000007CBC2BA8
00007F8F6AF47AC0       4471          1          1          1 KGLH0^fc6164a    000000007CE6D850       4096 freeabl           0 000000007CBC2BA8
00007F8F6AF30440       4856          1          1          1 KGLH0^fc6164a    000000007CC973C8       4096 freeabl           0 000000007CBC2BA8
00007F8F6AF33E80       4965          1          1          1 KGLH0^fc6164a    000000007CBD41F0       4096 freeabl           0 000000007CBC2BA8
00007F8F6B0A1400       5593          1          1          1 KGLH0^fc6164a    000000007C7F4F60       4096 freeabl           0 000000007CBC2BA8
00007F8F6B08CD28       6025          1          1          1 KGLH0^fc6164a    000000007C55FC10       4096 freeabl           0 000000007CBC2BA8
00007F8F6B0907B0       6226          1          1          1 KGLH0^fc6164a    000000007C442F48       4096 freeabl           0 000000007CBC2BA8
00007F8F6B07A300       6652          1          1          1 KGLH0^fc6164a    000000007C137798       4096 freeabl           0 000000007CBC2BA8
00007F8F6B070CD8       7591          1          1          1 KGLH0^fc6164a    000000007BC7D898       4096 freeabl           0 000000007CBC2BA8
00007F8F6B072158       7717          1          1          1 KGLH0^fc6164a    000000007BB93BC0       4096 freeabl           0 000000007CBC2BA8
00007F8F6B074238       7807          1          1          1 KGLH0^fc6164a    000000007BB49798       4096 freeabl           0 000000007CBC2BA8
00007F8F6B0754B8       7846          1          1          1 KGLH0^fc6164a    000000007BB19348       4096 freeabl           0 000000007CBC2BA8
00007F8F6B058C38       8653          1          1          1 KGLH0^fc6164a    000000007B62C700       4096 freeabl           0 000000007CBC2BA8
00007F8F6B05AFB8       8778          1          1          1 KGLH0^fc6164a    000000007B5A06E8       4096 freeabl           0 000000007CBC2BA8
00007F8F6B05C6B0       8804          1          1          1 KGLH0^fc6164a    000000007B588C38       4096 freeabl           0 000000007CBC2BA8
00007F8F6B05DDA8       8830          1          1          1 KGLH0^fc6164a    000000007B55FD78       4096 recr           4095 000000007CBC2BA8
00007F8F6B02A960       8930          1          1          1 KGLH0^fc6164a    000000007B4D8640       4096 freeabl           0 000000007CBC2BA8
00007F8F6B02A490       8944          1          1          1 KGLH0^fc6164a    000000007B4AAFF0       4096 freeabl           0 000000007CBC2BA8
22 rows selected.
--//可以發現如果產生子游標很多,父游標堆0的chunk也會很多,不像1個子游標的情況下僅僅1個chunk.

--//查看父游標堆0的描述符chunk:
SELECT * FROM x$ksmsp WHERE TO_NUMBER ('000000007CBC2BA8', 'xxxxxxxxxxxxxxxx') between TO_NUMBER(KSMCHPTR, 'xxxxxxxxxxxxxxxx') and TO_NUMBER(KSMCHPTR, 'xxxxxxxxxxxxxxxx')+KSMCHSIZ
ADDR                   INDX    INST_ID   KSMCHIDX   KSMCHDUR KSMCHCOM         KSMCHPTR           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00007F8F6AF337F8       4997          1          1          1 KGLDA            000000007CBC2B40        240 freeabl           0 00

SYS@book> @ &r/sharepool/shp4 2xw4k6w7wc5ka 0
TEXT           KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
-------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
子游標句柄地址 000000007CBC27E0 000000007CBC2C60 SELECT count(*) FROM dept WHERE deptno=1          0          0          0 000000007CBC2728 000000007B5604E8       4488       8088      80634     93210      93210  264640074 2xw4k6w7wc5ka          0
子游標句柄地址 000000007C6C4A90 000000007CBC2C60 SELECT count(*) FROM dept WHERE deptno=1          0          0          0 000000007C6C49D8 000000007B560AB0       4488       8088      80634     93210      93210  264640074 2xw4k6w7wc5ka          1
子游標句柄地址 000000007DA59628 000000007CBC2C60 SELECT count(*) FROM dept WHERE deptno=1          0          0          0 000000007DA59570 000000007B4D89C0       4488       8088      80634     93210      93210  264640074 2xw4k6w7wc5ka          2
子游標句柄地址 000000007D66E770 000000007CBC2C60 SELECT count(*) FROM dept WHERE deptno=1          0          0          0 000000007D66E6B8 000000007B4D8E80       4488       8088      80634     93210      93210  264640074 2xw4k6w7wc5ka          3
...//太長
子游標句柄地址 000000007B693320 000000007CBC2C60 SELECT count(*) FROM dept WHERE deptno=1          1          0          0 000000007B693268 000000007D87A1B0       4488       8088      80634     93210      93210  264640074 2xw4k6w7wc5ka         63
父游標句柄地址 000000007CBC2C60 000000007CBC2C60 SELECT count(*) FROM dept WHERE deptno=1          1          0          0 000000007CBC2BA8 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
65 rows selected.

--//隨便看看一個子游標堆6的描述符chunk:(KGLOBHD6=000000007D87A1B0)
SELECT * FROM x$ksmsp WHERE TO_NUMBER ('000000007D87A1B0', 'xxxxxxxxxxxxxxxx') between TO_NUMBER(KSMCHPTR, 'xxxxxxxxxxxxxxxx') and TO_NUMBER(KSMCHPTR, 'xxxxxxxxxxxxxxxx')+KSMCHSIZ
ADDR                   INDX    INST_ID   KSMCHIDX   KSMCHDUR KSMCHCOM         KSMCHPTR           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00007F8F6AF6DD40       2621          1          1          1 KGLH0^fc6164a    000000007D879970       4096 freeabl           0 000000007CBC2BA8

--//可以發現堆6的描述符chunk與前面的父游標堆0的chunk相同,註意看前面下劃線內容.也就是子游標堆6的描述符chunk在父游標堆0的chunk中.

4.繼續測試_cursor_obsolete_threshold限制子游標的數量.
--//退出session 1,刷新共用池.
--//session 2:
SYS@book> alter system flush shared_pool;
System altered.

SCOTT@book> alter session set "_cursor_obsolete_threshold"=64;
Session altered.
--//預設參數1024,有點大,減少到64,這樣好測試一些.

--//session 1:
SCOTT@book> @ aa.sql 1 65
PL/SQL procedure successfully completed.

--//session 2
SYS@book> @ &r/sharepool/shp4z 2xw4k6w7wc5ka 0
TEXT           KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
-------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
父游標句柄地址 000000007BBF0758 000000007BBF0758 SELECT count(*) FROM dept WHERE deptno=1          1          0 000000007DA01CE8 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007D0716A0 000000007D0716A0 SELECT count(*) FROM dept WHERE deptno=1          1          0 000000007B442B50 00                     4736          0          0      4736       4736  264640074 2xw4k6w7wc5ka      65535
--//產生2個父游標,註意2條記錄的KGLHDLMD=1.表示還沒有釋放游標.
--//註:我開始以為會出現多父多子的情況.實際上並不是,查看v$sql視圖就很容易明白.

SYS@book> select address,child_number,IS_OBSOLETE from v$sql where sql_id='2xw4k6w7wc5ka' and IS_OBSOLETE='N';
ADDRESS          CHILD_NUMBER I
---------------- ------------ -
000000007D0716A0            0 N

SYS@book> select address,IS_OBSOLETE,count(*) from v$sql where sql_id='2xw4k6w7wc5ka' group by address ,IS_OBSOLETE;
ADDRESS          I   COUNT(*)
---------------- - ----------
000000007D0716A0 N          1
000000007BBF0758 Y         64
--//可以發現僅僅1個子游標是IS_OBSOLETE='N'.其它IS_OBSOLETE='Y',共有64個子游標,而且地址也不同(這個地址對應父游標的地址).繼續測試:
--//父游標地址000000007BBF0758下的子游標都是IS_OBSOLETE='Y'.
--//session 1:
SCOTT@book> @ aa.sql 1 65
PL/SQL procedure successfully completed.

--//session 2:
SYS@book> @ &r/sharepool/shp4z 2xw4k6w7wc5ka 0
TEXT           KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
-------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
父游標句柄地址 000000007BBF0758 000000007BBF0758 SELECT count(*) FROM dept WHERE deptno=1          0          0 000000007DA01CE8 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007D0716A0 000000007D0716A0 SELECT count(*) FROM dept WHERE deptno=1          1          0 000000007B442B50 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007B59E0F8 000000007B59E0F8 SELECT count(*) FROM dept WHERE deptno=1          1          0 000000007B59E040 00                     4736          0          0      4736       4736  264640074 2xw4k6w7wc5ka      65535

SYS@book> select address,IS_OBSOLETE,count(*) from v$sql where sql_id='2xw4k6w7wc5ka' group by address ,IS_OBSOLETE;
ADDRESS          I   COUNT(*)
---------------- - ----------
000000007D0716A0 Y         64
000000007B59E0F8 N          2
000000007BBF0758 Y         64

--//產生2個父游標,註意後2條記錄的KGLHDLMD=1. 而地址000000007B59E0F8對應的IS_OBSOLETE='N',其它都是IS_OBSOLETE='Y'.
--//表示父游標句柄地址=000000007B59E0F8,當前有效(IS_OBSOLETE='N').繼續測試:

--//session 1:
SCOTT@book> @ aa.sql 1 65
PL/SQL procedure successfully completed.

--//session 2:
SYS@book> @ &r/sharepool/shp4z 2xw4k6w7wc5ka 0
TEXT           KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
-------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
父游標句柄地址 000000007BBF0758 000000007BBF0758 SELECT count(*) FROM dept WHERE deptno=1          0          0 000000007DA01CE8 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007D0716A0 000000007D0716A0 SELECT count(*) FROM dept WHERE deptno=1          0          0 000000007B442B50 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007B59E0F8 000000007B59E0F8 SELECT count(*) FROM dept WHERE deptno=1          1          0 000000007B59E040 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007CB65CB0 000000007CB65CB0 SELECT count(*) FROM dept WHERE deptno=1          1          0 000000007CB65BF8 00                     8808          0          0      8808       8808  264640074 2xw4k6w7wc5ka      65535

SYS@book> select address,IS_OBSOLETE,count(*) from v$sql where sql_id='2xw4k6w7wc5ka' group by address ,IS_OBSOLETE;
ADDRESS          I   COUNT(*)
---------------- - ----------
000000007D0716A0 Y         64
000000007BBF0758 Y         64
000000007B59E0F8 Y         64
000000007CB65CB0 N          3

--//大家自己看,不再說明.
--//可以發現1個規律.如果當前父游標下存在64個子游標的情況下,再有子游標產生,該父游標下的子游標無效(IS_OBSOLETE='Y'),建立新的父游標.
--//我前面調用的腳本@ aa.sql 1 65,每次都有1個子游標無法容納,產生1個新的父游標,這樣3次,這樣新建立的父游標下就存在3個子游標.

--//如果執行如下,就不會建立新的父游標.
--//session 1:
SCOTT@book> @ aa.sql 1 61
PL/SQL procedure successfully completed.

--//session 2:
SYS@book> @ &r/sharepool/shp4z 2xw4k6w7wc5ka 0
old  21:  WHERE kglobt03 = '&1'  or kglhdpar='&1' or kglhdadr='&1' or KGLNAHSH= &2
new  21:  WHERE kglobt03 = '2xw4k6w7wc5ka'  or kglhdpar='2xw4k6w7wc5ka' or kglhdadr='2xw4k6w7wc5ka' or KGLNAHSH= 0
TEXT           KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
-------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
父游標句柄地址 000000007BBF0758 000000007BBF0758 SELECT count(*) FROM dept WHERE deptno=1          0          0 000000007DA01CE8 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007D0716A0 000000007D0716A0 SELECT count(*) FROM dept WHERE deptno=1          0          0 000000007B442B50 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007B59E0F8 000000007B59E0F8 SELECT count(*) FROM dept WHERE deptno=1          0          0 000000007B59E040 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007CB65CB0 000000007CB65CB0 SELECT count(*) FROM dept WHERE deptno=1          1          0 000000007CB65BF8 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535

SYS@book> select address,IS_OBSOLETE,count(*) from v$sql where sql_id='2xw4k6w7wc5ka' group by address ,IS_OBSOLETE;
ADDRESS          I   COUNT(*)
---------------- - ----------
000000007D0716A0 Y         64
000000007BBF0758 Y         64
000000007B59E0F8 Y         64
000000007CB65CB0 N         64
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--//註意看KGLHDLMD=1那行,父游標句柄地址=000000007CB65CB0.與下劃線看到的地址一致(IS_OBSOLETE='N').如果我繼續執行
--//session 1:
SCOTT@book> @ aa.sql 1 64
PL/SQL procedure successfully completed.

--//session 2:
SYS@book> @ &r/sharepool/shp4z 2xw4k6w7wc5ka 0
TEXT           KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
-------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
父游標句柄地址 000000007BBF0758 000000007BBF0758 SELECT count(*) FROM dept WHERE deptno=1          0          0 000000007DA01CE8 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007D0716A0 000000007D0716A0 SELECT count(*) FROM dept WHERE deptno=1          0          0 000000007B442B50 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007B59E0F8 000000007B59E0F8 SELECT count(*) FROM dept WHERE deptno=1          0          0 000000007B59E040 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007CB65CB0 000000007CB65CB0 SELECT count(*) FROM dept WHERE deptno=1          1          0 000000007CB65BF8 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007CE9EFB8 000000007CE9EFB8 SELECT count(*) FROM dept WHERE deptno=1          1          0 000000007CE9EF00 00                     8808          0          0      8808       8808  264640074 2xw4k6w7wc5ka      65535

SYS@book> select address,IS_OBSOLETE,count(*) from v$sql where sql_id='2xw4k6w7wc5ka' group by address ,IS_OBSOLETE;
ADDRESS          I   COUNT(*)
---------------- - ----------
000000007CE9EFB8 N          3
000000007CB65CB0 Y         64
000000007D0716A0 Y         64
000000007BBF0758 Y         64
000000007B59E0F8 Y         64

--//奇怪竟然又生產新的父游標,下麵有3個子游標.why?
--//中午自己認真看一遍,突然明白為什麼存在3個子游標,IS_OBSOLETE='N'.

5.一步一步來解析:
--//執行@ aa.sql 1 65, 一個父游標僅僅有64個子游標,這樣最後1個語句,生成新父游標,對應的optimizer_index_caching=65.
--//執行@ aa.sql 1 65, 執行到optimizer_index_caching=64時,該父游標無法再加入子游標,生成新父游標,對應的optimizer_index_caching=64,65.存在2個子游標.
--//執行@ aa.sql 1 65, 執行到optimizer_index_caching=63時,該父游標無法再加入子游標,生成新父游標,對應的optimizer_index_caching=63,64,65.
--//執行@ aa.sql 1 61, 對於父游標正好有64個子游標.不會生成新的父游標.而對應子游標的optimizer_index_caching=63,64,65,1,2,....,61
--//執行@ aa.sql 1 64, optimizer_index_caching從1,2,..,61都能找到對應的子游標.而當執行optimizer_index_caching=62時,全部子游標不合適.
--//而且該父游標下已經存在64個子游標,這樣該父游標下全部子游標變成IS_OBSOLETE='Y'.生成新的父游標.對應的optimizer_index_caching=62,63,64.存在3個子游標.

--//可以通過一個簡單的測試證明自己的判斷:
--//退出sessioin 1,刷新共用池.
--//session 2:
SYS@book> alter system flush shared_pool;
System altered.

--//session 1,順序執行如下:
SCOTT@book> alter session set "_cursor_obsolete_threshold"=64;
Session altered.

@ aa.sql 1 65
@ aa.sql 1 65
@ aa.sql 1 65
@ aa.sql 1 61

--//建立測試腳本ab.sql:
$ cat ab.sql
DECLARE
    l_count PLS_INTEGER;
BEGIN
    FOR i IN 62..64
    LOOP
    EXECUTE IMMEDIATE 'ALTER SESSION SET optimizer_index_caching = '||i;
    FOR j IN 1..&&1
    LOOP
        EXECUTE IMMEDIATE 'ALTER SESSION SET optimizer_index_cost_adj = '||j;
        EXECUTE IMMEDIATE 'SELECT count(*) FROM dept WHERE deptno=10' into l_count;
    END LOOP;
    END LOOP;
END;
/
--//註:僅僅調用執行optimizer_index_caching=62,63,64的情況.

--//session 1
SCOTT@book> @ ab.sql 1
PL/SQL procedure successfully completed.

--//session 2:
SYS@book> @ &r/sharepool/shp4z 2xw4k6w7wc5ka 0
TEXT           KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
-------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
父游標句柄地址 000000007D3E0D18 000000007D3E0D18 SELECT count(*) FROM dept WHERE deptno=1          0          0 000000007D3E0C60 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007CD26CF0 000000007CD26CF0 SELECT count(*) FROM dept WHERE deptno=1          0          0 000000007CD26C38 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007B4808C0 000000007B4808C0 SELECT count(*) FROM dept WHERE deptno=1          0          0 000000007B480808 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007D14F128 000000007D14F128 SELECT count(*) FROM dept WHERE deptno=1          1          0 000000007D14F070 00                    82104          0          0     82104      82104  264640074 2xw4k6w7wc5ka      65535
父游標句柄地址 000000007B9760C8 000000007B9760C8 SELECT count(*) FROM dept WHERE deptno=1          1          0 000000007B976010 00                     8808          0          0      8808       8808  264640074 2xw4k6w7wc5ka      65535

SYS@book> select address,IS_OBSOLETE,count(*) from v$sql where sql_id='2xw4k6w7wc5ka' group by address ,IS_OBSOLETE;
ADDRESS          I   COUNT(*)
---------------- - ----------
000000007D3E0D18 Y         64
000000007CD26CF0 Y         64
000000007B9760C8 N          3
000000007D14F128 Y         64
000000007B4808C0 Y         64

--//還有3個子游標,IS_OBSOLETE='N'.
--//測試有點亂,不過還是能基本說明問題.oracle各個版本_cursor_obsolete_threshold參數一直的不斷調整.
--//看來家裡的windows系統12.1.0.1:
SYS@test> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

SYS@test> @ hide _cursor_obsolete_threshold
NAME                       DESCRIPTION                                     DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE
-------------------------- ----------------------------------------------- ------------- ------------- ------------
_cursor_obsolete_threshold Number of cursors per parent before obsoletion. FALSE         64            64

--//據說12.2.0.1版本修改為8192.當然重點定位為什麼子游標太多,定位問題很關鍵.
--//我個人感覺1024還是比較合理.

6.附上測試腳本:
--//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;

--//shp4z.sql
column N0_6_16 format 99999999
select * from (
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
) where kglhdadr=kglhdpar;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 存儲過程 存儲過程是一個SQL語句集合,當主動去調用存儲過程時,其中內部的SQL語句會按照邏輯執行。 1、創建存儲過程 1 -- 創建存儲過程 2 3 delimiter // 4 create procedure p1() 5 BEGIN 6 select * from t1; 7 END// 8 ...
  • 1. ON 和WHERE 所有的查詢都回產生一個中間臨時報表,查詢結果就是從返回臨時報表中得到。ON和WHERE後面所跟限制條件的區別,主要與限制條件起作用的時機有關, ON根據限制條件對資料庫記錄進行過濾,然後生產臨時表;而WHERE是在臨時表生產之後,根據限制條件從臨時表中篩選結果。 因為以上原 ...
  • 刪除數據列 開發或者生產過程中多建、錯誤或者重覆的數據列需要進行刪除操作。 使用SSMS資料庫管理工具刪除數據列 方式一 1、打開資料庫->選擇數據表-》展開數據表-》展開數據列-》選擇要刪除的數據列-》右鍵點擊-》選擇刪除-》在彈出框中點擊確定。 方式二 1、打開資料庫-》打開數據表-》右鍵點擊- ...
  • 一個好的項目需要一個好的Makefile,分享一個萬能的模板。 ...
  • mysql按id的指定順序進行排序,以前解決過一次,後來忘了,記錄一下 SELECT * FROM `table` WHERE id<6 order by field(id,3,5,1,2,4) ...
  • Preface Today I'm gonna export some test data to another server.The source server is Windows Server 2012 R2 and the tartget server is CentOS 7.2.Event ...
  • 修改數據列 在開發和生產過程中,列名的拼寫錯誤或者列名的更改是需要操作數據表的,大多數情況下都是不需要修改的. 以下幾種情況下我們並不能直接修改數據列: 1、用於索引的列。 2、用於 CHECK、FOREIGN KEY、UNIQUE 或 PRIMARY KEY 約束的列。 3、與預設值(由 DEFA ...
  • [20180823]IMU與db link.txt--//當使用db link查看遠程表時,實際上會產生小小的日誌.--//當時如果與IMU結合在一起,可以導致IMU的失效.1.環境:SCOTT@book> @ ver1PORT_STRING VERSION BANNER x86_64/Linux ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...