[20180819]关于父子游标问题(11g).txt

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

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐