#define KGLTRCHSH 0x2000 /* trace by hash */
#define KGLTRCNSP 0x1000 /* trace by namespace */
#define KGLTRCLCK 0x0010 /* trace lock operations */
#define KGLTRCPIN 0x0020 /* trace pin operations */
#define KGLTRCOBF 0x0040 /* trace object freeing */
#define KGLTRCINV 0x0080 /* trace invalidations */
#define KGLDMPSTK 0x0100 /* dump the stack trace */
Event 10049事件可以用来跟踪cursor上library cache lock/pin的获取过程。
实验过程中我们需要通过cursor的hash value来跟踪 pin 和lock操作。
此事件的用法如下:
alter session set events '10049 trace name context forever,level N';
其中N值需要根据你的实验环境不同去替换:N由CURSOR HASH VALUE转换为16进制后的后四位+跟踪级别组成,N需要是10进制。
我们的例子里需要跟踪:0x2000 /* trace by hash */+0x0010 /* trace lock operations */+0x0020 /* trace pin operations */=2030
SQL> select count(*) from wxh_tbd where object_id=1;
COUNT(*)
----------
0
SQL> select hash_value from v$sql where sql_text like 'select count(*) from wxh_tbd%';
HASH_VALUE
----------
1748072644
SQL> select to_char(1748072644,'xxxxxxxxxxx') from dual;
TO_CHAR(1748072644,'XXXXXXXXXX
--------------------------------------------------------------------------------
683178c4
后四位为78c4
因此我们跟踪事件的N应该是:78c42030
转化为10进制
SQL> select to_number('78c42030','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('78C42030','XXXXXXXX
------------------------------
2026119216
SQL> alter session set events '10049 trace name context forever,level 2026119216';
Session altered.
SQL> select count(*) from wxh_tbd where object_id=1;
COUNT(*)
----------
0
查看跟踪过程中的跟踪文件
父游标handler为:0x6C869B28
子游标handler为:0x6CA15ECC
-------------第一种情况,硬解析
KGLTRCLCK kglget hd = 0x6C869B28 KGL Lock addr = 0x69843A4C mode = N
KGLTRCPIN kglpin hd = 0x6C869B28 KGL Pin addr = 0x69845080 mode = X
KGLTRCPIN kglpndl hd = 0x6C869B28 KGL Pin addr = 0x69845080 mode = X
KGLTRCLCK kglget hd = 0x6CA15ECC KGL Lock addr = 0x69846858 mode = N
KGLTRCPIN kglpin hd = 0x6CA15ECC KGL Pin addr = 0x6AFDE76C mode = X
KGLTRCPIN kglpndl hd = 0x6CA15ECC KGL Pin addr = 0x6AFDE76C mode = S
KGLTRCLCK kgllkdl hd = 0x6CA15ECC KGL Lock addr = 0x69846858 mode = N
KGLTRCLCK kgllkdl hd = 0x6C869B28 KGL Lock addr = 0x69843A4C mode = N
-------------第而种情况,软解析
SQL> select count(*) from wxh_tbd where object_id=1;
COUNT(*)
----------
0
KGLTRCLCK kglget hd = 0x6C869B28 KGL Lock addr = 0x6AFDE3F4 mode = N
KGLTRCLCK kglget hd = 0x6CA15ECC KGL Lock addr = 0x6AFDD7B4 mode = N
KGLTRCPIN kglpin hd = 0x6CA15ECC KGL Pin addr = 0x6AFDF424 mode = S
KGLTRCPIN kglpndl hd = 0x6CA15ECC KGL Pin addr = 0x6AFDF424 mode = S
KGLTRCLCK kgllkdl hd = 0x6CA15ECC KGL Lock addr = 0x6AFDD7B4 mode = N
KGLTRCLCK kgllkdl hd = 0x6C869B28 KGL Lock addr = 0x6AFDE3F4 mode = N
---------第三种情况,软软解析
SQL> alter session set session_cached_cursors=10;
Session altered.
KGLTRCPIN kglpin hd = 0x6CA15ECC KGL Pin addr = 0x69845080 mode = S
KGLTRCPIN kglpndl hd = 0x6CA15ECC KGL Pin addr = 0x69845080 mode = S
软软解析只获得了子LCO上的PIN就OK 了,而硬解析和软解析则要获得多次父游标和子游标的LOCK和PIN。
附件是沈总画的惊天地泣鬼神的图,有机会让沈总专门给大家讲下
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22034023/viewspace-713401/ ,如需转载,请注明出处,否则将追究法律责任。