[20210521]11g shared pool latch与library cache mutex的简单探究4.txt

来源:这里教程网 时间:2026-03-03 16:43:45 作者:

[20210521]11g shared pool latch与library cache mutex的简单探究4.txt --//继续昨天的测试: http://blog.itpub.net/267265/viewspace-2773083/ =>[20210520]11g shared pool latch与library cache mutex的简单探究3.txt 当时的总结: --//很明显前面3次出现都需要遇到这两个等待事件, --//第1次library cache: mutex X,再持有latch: shared pool --//第2,3次先持有latch: shared pool,然后才是library cache: mutex X. --//第4次没有需要latch: shared pool,library cache: mutex X。 --//有点不好理解的地方是为什么第1次library cache: mutex X,再持有latch: shared pool,而后面的第2,3次先持有latch: shared --//pool,然后才是library cache: mutex X. --//会不会11g的sqlplus客户端改变什么导致的情况。因为11g下sqlplus执行后不会马上释放光标,会不会就是这个原因导致出现这样的 --//情况。 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.测试: SCOTT@book> @ s SCOTT@book(295,5)> @ spid        SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50 ---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------        295          5 15988                    DEDICATED 15989       21          3 alter system kill session '295,5' immediate; $ cat latch_mutex.gdb break kslgetl if $rdi==0X6010D860   commands     silent     printf "kslgetl %x, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx     c   end break kglGetMutex if $rsi==0X80528f40   commands     silent     printf "kglGetMutex %x, %x, %x, %d\n", $rdi, $rsi, $rdx, $rcx     c   end --//执行如下命令多次,避免一些递归。 --//desc dept; --//Select * from dept where deptno=20; --//select sysdate from dual; --//session 1,第1次执行: SCOTT@book(295,5)> select * from dept where deptno=20;     DEPTNO DNAME          LOC ---------- -------------- -------------         20 RESEARCH       DALLAS $ gdb -p 15989 -x latch_mutex.gdb ... (gdb) c Continuing. kglGetMutex c0cc9e0, 80528f40, 7d4f8a18, 1 kslgetl 6010d860, 1, 0, 3980 --//session 1,顺便执行其它语句,比如: select sysdate from dual; --//因为这条语句已经在测试前执行多次,光标已经缓存。后面测试按照这样的方式执行,也就是执行顺序是: select * from dept where deptno=20; select sysdate from dual; --//循环往复,不再说明: --//session 1,第2次执行前执行: SCOTT@book(44,11)> select sysdate from dual ; SYSDATE ------------------- 2021-05-21 09:39:35 --//gdb界面会出现: kslgetl 6010d860, 1, 2097785048, 3991 --//按照道理应该不会有输出,因为上面的语句光标已经缓存,可以推测这个就是前面的语句select * from dept where deptno=20;导致的情况。 --//session 1,第2次执行: kglGetMutex c0cc9e0, 80528f40, 7d4f8a18, 1 kslgetl 6010d860, 1, 0, 4039 kslgetl 6010d860, 1, 0, 3980 kslgetl 6010d860, 1, 0, 4039 --//session 1,第3次执行前执行: SCOTT@book(44,11)> select sysdate from dual ; SYSDATE ------------------- 2021-05-21 09:42:25 --//gdb界面再次出现: kslgetl 6010d860, 1, 2097785048, 3991 --//session 1,第3次执行: kglGetMutex c0cc9e0, 80528f40, 7d4f8a18, 1 --//session 1,第3次执行前执行: SCOTT@book(44,11)> select sysdate from dual ; SYSDATE ------------------- 2021-05-21 09:43:51 --//gdb界面,这次没有输出,也就是一旦sql语句缓存,不再出现调用kslgetl的情况。 --//session 1,第4次执行: --//没有任何输出。 --//我反复测试多次,都是这样的情况。

相关推荐