动态

详情 返回 返回

[20250727]關於訪問系統視圖v$sqlXXXX的問題.txt - 动态 详情

[20250727]關於訪問系統視圖v$sqlXXXX的問題.txt

--//如果定位解決問題,經常會訪問系統視圖以v$sql開頭的視圖。例如v$sql視圖,其底層視圖是x$kglcursor_child,v$sqlarea其底層視
--//圖是x$kglcursor_child_sqlid.如果幾個會話同時訪問,以前測試過會出現library cache: mutex X等待事件,當時許多概念不是很清
--//晰,裏面一些細節很沒有做探究,有時間重複測試看看。

1.環境:
SCOTT@book01p> @ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 21.0.0.0.0
BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

2.測試腳本建立:
$ cat loop.txt
declare
v_count number;
begin
    for i in 1 .. &&1 loop
        --select count(*) into v_count from v$session ;
        --select count(*) into v_count from v$sql ;
        select count(*) into v_count from v$sql where rownum<=1;
    end loop;
end ;
/
--//僅僅取1條記錄。

$ cat record.txt
set verify off
variable v_method varchar2(20)
exec :v_method :=  (case when '&2' >= '1' and '&2'<='9999' then 'QQQQ' else '&2' end);

define t=&&1;

set term off
column 3 new_value 3;
select decode('&3',null,'loop.txt','&&3') "3" from dual;
set term on

@@ &&3 5 &&2

--//insert into job_times values ( sys_context ('userenv', 'sid') ,dbms_utility.get_time ,:v_method) ;
--//commit ;

@@ &&3 &&t &&2

--//update job_times set time_ela = dbms_utility.get_time - time_ela where sid=sys_context ('userenv', 'sid') and method= :v_method;
--//commit;
quit

3.測試:
--//測試前執行:
SYS@book> select sql_id ,hash_value,mod(hash_value,power(2,17)),FIRST_LOAD_TIME,con_id from v$sql where rownum<=5;

SQL_ID        HASH_VALUE MOD(HASH_VALUE,POWER(2,17)) FIRST_LOAD_TIME                            CON_ID
------------- ---------- --------------------------- -------------------------------------- ----------
94qn6y14kw01g 1227751471                          47 2025-07-27/09:58:24                             1
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             1
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             1
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             1
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             3

SYS@book01p> select sql_id ,hash_value,mod(hash_value,power(2,17)),FIRST_LOAD_TIME,con_id from v$sql where rownum<=5;
SQL_ID        HASH_VALUE MOD(HASH_VALUE,POWER(2,17)) FIRST_LOAD_TIME                            CON_ID
------------- ---------- --------------------------- -------------------------------------- ----------
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             3
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             3
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             3
06gfrprr7w0r2 4001235682                         738 2025-07-27/09:47:19                             3
06gfrprr7w0r2 4001235682                         738 2025-07-27/09:47:19                             3

--//注意兩者的區別,前者在cdb層面上訪問,後者在pdb層面上訪問。

$ zzdate ; seq 50 | xargs -P 50 -IQ sqlplus scott/book@book01p @record.txt 2e4 aaaa loop.txt > /dev/null; zzdate
trunc(sysdate)+10/24+12/1440+36/86400 1753582356.828121789
trunc(sysdate)+10/24+13/1440+05/86400 1753582385.728571377

SYS@book> @ ashtop event,sql_id 1=1 trunc(sysdate)+10/24+12/1440+36/86400 trunc(sysdate)+10/24+13/1440+05/86400
    Total                                                                                                                    Distinct Distinct    Distinct
  Seconds     AAS %This   EVENT                                      SQL_ID        FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ------------------------------------------ ------------- ------------------- ------------------- ---------- -------- -----------
     1043    36.0   85% | library cache: bucket mutex X              6s0qhxyxjpurx 2025-07-27 10:12:38 2025-07-27 10:13:04       1043       27        1043
      129     4.4   10% |                                            6s0qhxyxjpurx 2025-07-27 10:12:37 2025-07-27 10:13:04        126       24         129
       29     1.0    2% | library cache: mutex X                     6s0qhxyxjpurx 2025-07-27 10:12:37 2025-07-27 10:13:02         29       16          29
       12      .4    1% | cursor: pin S                                            2025-07-27 10:12:39 2025-07-27 10:12:49          1        3           3
        9      .3    1% |                                            fm1tb5mss6fsj 2025-07-27 10:12:40 2025-07-27 10:12:54          8        7           8
        6      .2    0% |                                                          2025-07-27 10:12:38 2025-07-27 10:12:57          1        5           5
        3      .1    0% | cursor: mutex S                            6s0qhxyxjpurx 2025-07-27 10:12:40 2025-07-27 10:12:58          3        3           3
        1      .0    0% | latch: active service list                               2025-07-27 10:13:02 2025-07-27 10:13:02          1        1           1
        1      .0    0% | log file sync                                            2025-07-27 10:12:38 2025-07-27 10:12:38          1        1           1
9 rows selected.

SYS@book> @ sql_id 6s0qhxyxjpurx
-- SQL_ID = 6s0qhxyxjpurx come from shared pool
SELECT COUNT(*) FROM V$SQL WHERE ROWNUM<=1;
--//實際上大部分集中在library cache: bucket mutex X,以前的測試標識為library cache: mutex X。現在版本標識為library
--//cache: bucket mutex X.當然僅僅密集的執行會出現這樣的情況。

SYS@book> @ ashtop event,p1raw,p1,p3raw  1=1 trunc(sysdate)+10/24+12/1440+36/86400 trunc(sysdate)+10/24+13/1440+05/86400
    Total                                                                                                                                                     Distinct Distinct    Distinct
  Seconds     AAS %This   EVENT                                      P1RAW                     P1 P3RAW             FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ------------------------------------------ ----------------- ---------- ----------------- ------------------- ------------------- ---------- -------- -----------
      241     8.3   20% | library cache: bucket mutex X              00000000000000C0         192 0000000000000031  2025-07-27 10:12:39 2025-07-27 10:13:02        241       15         241
      115     4.0    9% | library cache: bucket mutex X              000000000000004A          74 0000000000000031  2025-07-27 10:12:39 2025-07-27 10:13:04        115       12         115
      104     3.6    8% | library cache: bucket mutex X              0000000000000074         116 0000000000000031  2025-07-27 10:12:39 2025-07-27 10:13:04        104       10         104
       93     3.2    8% | library cache: bucket mutex X              0000000000000033          51 0000000000000031  2025-07-27 10:12:38 2025-07-27 10:12:57         93        6          93
       68     2.3    6% | library cache: bucket mutex X              000000000000002F          47 0000000000000031  2025-07-27 10:12:38 2025-07-27 10:13:03         68        6          68
       65     2.2    5% | library cache: bucket mutex X              000000000000008D         141 0000000000000031  2025-07-27 10:12:44 2025-07-27 10:13:02         65        6          65
       64     2.2    5% | library cache: bucket mutex X              0000000000000064         100 0000000000000031  2025-07-27 10:12:40 2025-07-27 10:13:00         64        4          64
       49     1.7    4% | library cache: bucket mutex X              00000000000000C0         192 0000000000000091  2025-07-27 10:12:39 2025-07-27 10:13:03         49       17          49
       33     1.1    3% |                                                                     192                   2025-07-27 10:12:39 2025-07-27 10:13:02         32       12          33
       27      .9    2% | library cache: bucket mutex X              0000000000000011          17 0000000000000031  2025-07-27 10:12:39 2025-07-27 10:12:57         27        6          27
       26      .9    2% | library cache: bucket mutex X              000000000000002A          42 0000000000000031  2025-07-27 10:12:45 2025-07-27 10:13:03         26        4          26
       23      .8    2% | library cache: bucket mutex X              0000000000000005           5 0000000000000031  2025-07-27 10:12:39 2025-07-27 10:13:02         23        6          23
       21      .7    2% | library cache: bucket mutex X              000000000000003C          60 0000000000000031  2025-07-27 10:12:47 2025-07-27 10:13:01         21        3          21
       21      .7    2% | library cache: bucket mutex X              00000000000000A2         162 0000000000000031  2025-07-27 10:12:49 2025-07-27 10:13:04         21        3          21
       21      .7    2% | library cache: bucket mutex X              00000000000000B9         185 0000000000000031  2025-07-27 10:12:40 2025-07-27 10:12:58         21        3          21
       19      .7    2% | library cache: bucket mutex X              0000000000000037          55 0000000000000031  2025-07-27 10:12:44 2025-07-27 10:13:04         19        4          19
       19      .7    2% | library cache: bucket mutex X              000000000000007E         126 0000000000000031  2025-07-27 10:12:45 2025-07-27 10:12:49         19        2          19
       19      .7    2% | library cache: mutex X                     00000000D19000C0  3515875520 D19000C00000007C  2025-07-27 10:12:37 2025-07-27 10:13:02         19       12          19
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       17      .6    1% | library cache: bucket mutex X              00000000000000B1         177 0000000000000031  2025-07-27 10:12:44 2025-07-27 10:12:45         17        2          17
       16      .6    1% |                                                                      51                   2025-07-27 10:12:40 2025-07-27 10:12:57         15        6          16
       12      .4    1% | cursor: pin S                              00000000BB1AEAFD  3139103485 0000000900000000  2025-07-27 10:12:39 2025-07-27 10:12:49          1        3           3
       11      .4    1% | library cache: bucket mutex X              00000000000000B4         180 0000000000000031  2025-07-27 10:12:40 2025-07-27 10:13:03         11        3          11
       10      .3    1% | library cache: bucket mutex X              000000000000004A          74 0000000000000091  2025-07-27 10:12:46 2025-07-27 10:13:04         10        6          10
       10      .3    1% |                                                                       5                   2025-07-27 10:12:44 2025-07-27 10:13:02         10        4          10
       10      .3    1% |                                                              3515875520                   2025-07-27 10:12:44 2025-07-27 10:13:03         10        8          10
        8      .3    1% |                                                                      74                   2025-07-27 10:12:44 2025-07-27 10:13:04          8        5           8
        7      .2    1% | library cache: mutex X                     00000000D19000C0  3515875520 D19000C00000007B  2025-07-27 10:12:42 2025-07-27 10:13:00          7        7           7
        7      .2    1% |                                                                     141                   2025-07-27 10:12:44 2025-07-27 10:13:02          7        4           7
        6      .2    0% |                                                                     116                   2025-07-27 10:12:48 2025-07-27 10:13:04          6        5           6
        5      .2    0% | library cache: bucket mutex X              000000000000002F          47 0000000000000091  2025-07-27 10:12:38 2025-07-27 10:13:03          5        3           5
30 rows selected.

--//如果仔細看library cache: bucket mutex X等待事件的P1,發現都不會大於2^17 = 131072.P3RAW=0x31=49.0x91 = 145.
--//注:以前的測試已經説明小於2^17也可能是sql語句的hash值,不過大部分情況應該是library cache  bucket。
--//你可以結合P3的輸出。比如下劃線P3RAW=D19000C00000007B,前8位D19000C0 = 3515875520,正好等於P1,確定是否是sql語句或者
--//其他對象的hash值。

SYS@book> @ ashtop p1 "event='library cache: bucket mutex X' "  trunc(sysdate)+10/24+12/1440+36/86400 trunc(sysdate)+10/24+13/1440+05/86400
    Total                                                                      Distinct Distinct    Distinct
  Seconds     AAS %This           P1 FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ---------- ------------------- ------------------- ---------- -------- -----------
      290    10.0   28% |        192 2025-07-27 10:12:39 2025-07-27 10:13:03        290       18         290
      125     4.3   12% |         74 2025-07-27 10:12:39 2025-07-27 10:13:04        125       13         125
      105     3.6   10% |        116 2025-07-27 10:12:39 2025-07-27 10:13:04        105       11         105
       98     3.4    9% |         51 2025-07-27 10:12:38 2025-07-27 10:12:57         98        6          98
       73     2.5    7% |         47 2025-07-27 10:12:38 2025-07-27 10:13:03         73        6          73
       68     2.3    7% |        141 2025-07-27 10:12:44 2025-07-27 10:13:02         68        6          68
       64     2.2    6% |        100 2025-07-27 10:12:40 2025-07-27 10:13:00         64        4          64
       27      .9    3% |         17 2025-07-27 10:12:39 2025-07-27 10:12:57         27        6          27
       26      .9    2% |         42 2025-07-27 10:12:45 2025-07-27 10:13:03         26        4          26
       25      .9    2% |          5 2025-07-27 10:12:38 2025-07-27 10:13:02         25        8          25
       21      .7    2% |         60 2025-07-27 10:12:47 2025-07-27 10:13:01         21        3          21
       21      .7    2% |        162 2025-07-27 10:12:49 2025-07-27 10:13:04         21        3          21
       21      .7    2% |        185 2025-07-27 10:12:40 2025-07-27 10:12:58         21        3          21
       19      .7    2% |         55 2025-07-27 10:12:44 2025-07-27 10:13:04         19        4          19
       19      .7    2% |        126 2025-07-27 10:12:45 2025-07-27 10:12:49         19        2          19
       18      .6    2% |        177 2025-07-27 10:12:44 2025-07-27 10:12:45         18        2          18
       11      .4    1% |        180 2025-07-27 10:12:40 2025-07-27 10:13:03         11        3          11
        5      .2    0% |        154 2025-07-27 10:12:39 2025-07-27 10:12:44          5        2           5
        4      .1    0% |         67 2025-07-27 10:12:52 2025-07-27 10:12:52          4        1           4
        2      .1    0% |         98 2025-07-27 10:12:44 2025-07-27 10:13:02          2        2           2
        1      .0    0% |         39 2025-07-27 10:12:40 2025-07-27 10:12:40          1        1           1
21 rows selected.

--//還可以發現一個特點,就是p1的值都不是一樣的,但是都沒有大於192,而且P1=192的出現的最多。估計與我執行select count(*)
--//into v_count from v$sqlwhere rownum<=1;僅僅取1行記錄有關。

--//測試後執行:
SYS@book01p> select sql_id ,hash_value,mod(hash_value,power(2,17)),FIRST_LOAD_TIME,con_id from v$sql where rownum<=5;
SQL_ID        HASH_VALUE MOD(HASH_VALUE,POWER(2,17)) FIRST_LOAD_TIME                            CON_ID
------------- ---------- --------------------------- -------------------------------------- ----------
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             3
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             3
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             3
06gfrprr7w0r2 4001235682                         738 2025-07-27/09:47:19                             3
06gfrprr7w0r2 4001235682                         738 2025-07-27/09:47:19                             3

SYS@book> select sql_id ,hash_value,mod(hash_value,power(2,17)),FIRST_LOAD_TIME,con_id from v$sql where rownum<=5;
SQL_ID        HASH_VALUE MOD(HASH_VALUE,POWER(2,17)) FIRST_LOAD_TIME                            CON_ID
------------- ---------- --------------------------- -------------------------------------- ----------
94qn6y14kw01g 1227751471                          47 2025-07-27/09:58:24                             1
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             1
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             1
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             1
gngtvs38t0060 3515875520                         192 2025-07-27/09:47:24                             3
--//是否可以猜測執行先從library cache  bucket=0開始掃描。如果存在對象給對應的bucket加上mutex X。這樣掃描到bucket=192時找
--//到符合條件的記錄。

SYS@book> @ mutexprofz idn,hash,loc,maddr  "ts>=trunc(sysdate)+10/24+12/1440+36/86400 and ts<=trunc(sysdate)+10/24+13/1440+05/86400 and idn<=192"

-- MutexProf by Tanel Poder (http://www.tanelpoder.com)
-- Showing profile of top 50 sleeps...
-- column info : id idn hash hash_value=>hash_value ts=>sleep_timestamp
--               req=>requesting_session blk=>blocking_session val=>mutex_value maddr=>mutex_addr

SUM_SLEEPS      GETS_DIFF MUTEX_TYPE             IDN       HASH GET_LOCATION                      mutex_addr           SQL_ID        OBJECT_NAME
---------- -------------- --------------- ---------- ---------- --------------------------------- -------------------- ------------- ---------------------------------
        63         361088 Library Cache          141            kglic1    49                      0000000075BFB3F8                   (name not found)
        57         239614 Library Cache          192            kglic1    49                      0000000075BFBD88                   (name not found)
        53         446588 Library Cache            5            kglic1    49                      0000000075BF9A78                   (name not found)
        49         213570 Library Cache          126            kglic1    49                      0000000075BFB128                   (name not found)
        47         431028 Library Cache           60            kglic1    49                      0000000075BFA4C8                   (name not found)
        41         264890 Library Cache           51            kglic1    49                      0000000075BFA318                   (name not found)
        37         235694 Library Cache          162            kglic1    49                      0000000075BFB7E8                   (name not found)
        31         258024 Library Cache          185            kglic1    49                      0000000075BFBC38                   (name not found)
        23         177626 Library Cache           67            kglic1    49                      0000000075BFA618                   (name not found)
        23         328917 Library Cache           74            kglic1    49                      0000000075BFA768                   (name not found)
        23         248323 Library Cache           55            kglic1    49                      0000000075BFA3D8                   (name not found)
        23          89019 Library Cache           17            kglic1    49                      0000000075BF9CB8                   (name not found)
        22         239897 Library Cache           47            kglic1    49                      0000000075BFA258                   (name not found)
        21         286103 Library Cache          116            kglic1    49                      0000000075BFAF48                   (name not found)
        19        1425357 Cursor Stat              0            qesdpIsResolved [KKSSTALOC14]     0000000067B26FB0                   (name not found)
        19         272936 Library Cache          113            kglic1    49                      0000000075BFAEB8                   (name not found)
        18         806504 Cursor Stat              0            qesdpIsResolved [KKSSTALOC14]     0000000066B348A0                   (name not found)
        18         132440 Library Cache           39            kglic1    49                      0000000075BFA0D8                   (name not found)
        17         177166 Library Cache          154            kglic1    49                      0000000075BFB668                   (name not found)
        16          35594 Library Cache          177            kglic1    49                      0000000075BFBAB8                   (name not found)
        16          86109 Library Cache          192            kglic4       145                  0000000075BFBD88                   (name not found)
        14         912888 Cursor Stat              0            qesdpIsResolved [KKSSTALOC14]     000000006D338FC0                   (name not found)
        12        1770707 Cursor Stat              0            qesdpIsResolved [KKSSTALOC14]     000000006D4CB2B0                   (name not found)
        11         923440 Cursor Stat              0            qesdpIsResolved [KKSSTALOC14]     0000000067149170                   (name not found)
         7         260783 Library Cache           98            kglic1    49                      0000000075BFABE8                   (name not found)
         7           4617 Library Cache           74            kglic4       145                  0000000075BFA768                   (name not found)
         6         737452 Cursor Stat              0            qesdpIsResolved [KKSSTALOC14]     0000000069A148D8                   (name not found)
         5           9378 Library Cache          100            kglic1    49                      0000000075BFAC48                   (name not found)
         4                Cursor Stat              0            qesdpIsResolved [KKSSTALOC14]     000000006BA90530                   (name not found)
         4         154600 Library Cache          180            kglic1    49                      0000000075BFBB48                   (name not found)
         3          76171 Library Cache           47            kglic4       145                  0000000075BFA258                   (name not found)
         3                Library Cache           51            kglic4       145                  0000000075BFA318                   (name not found)
         3         426969 Cursor Stat              0            qesdpIsResolved [KKSSTALOC14]     0000000071314130                   (name not found)
         2         106936 Library Cache          141            kglic4       145                  0000000075BFB3F8                   (name not found)
         1                Library Cache            5            kglic4       145                  0000000075BF9A78                   (name not found)
         1                Library Cache           42            kglic1    49                      0000000075BFA168                   (name not found)
36 rows selected.
--//GET_LOCATION裏面的數字49(0x31),145(0x91)對應p3raw的後8位。

4.繼續測試:
--//前面P1=192,47上好理解,有對象在相應的buckect,出現其他數字,又是怎麼的情況呢?
--//注:我反覆關閉數據庫重複測試多次,發現出現的數字還是這些,基本沒有變化。

--//轉儲library_cache:
SYS@book> oradebug setmypid
Statement processed.
SYS@book> oradebug dump library_cache 4
Statement processed.

$ grep "^Bucket" /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_4197.trc |head -22
Bucket: #=5 Mutex=0x75bf9a78(1198295875584, 3000888, 6134, 6)
Bucket: #=17 Mutex=0x75bf9cb8(1198295875584, 2000597, 2379, 6)
Bucket: #=39 Mutex=0x75bfa0d8(1198295875584, 2000578, 3474, 6)
Bucket: #=42 Mutex=0x75bfa168(1198295875584, 2000562, 3569, 6)
Bucket: #=47 Mutex=0x75bfa258(1198295875584, 2000588, 8769, 6)
Bucket: #=51 Mutex=0x75bfa318(1198295875584, 2000600, 7764, 6)
Bucket: #=55 Mutex=0x75bfa3d8(1198295875584, 2000583, 4032, 6)
Bucket: #=60 Mutex=0x75bfa4c8(1198295875584, 2000602, 3026, 6)
Bucket: #=67 Mutex=0x75bfa618(1198295875584, 2000575, 3334, 6)
Bucket: #=74 Mutex=0x75bfa768(1198295875584, 3000880, 18732, 6)
Bucket: #=98 Mutex=0x75bfabe8(1198295875584, 2000584, 2588, 6)
Bucket: #=100 Mutex=0x75bfac48(1198295875584, 2000564, 3009, 6)
Bucket: #=113 Mutex=0x75bfaeb8(1198295875584, 2000601, 4520, 6)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Bucket: #=116 Mutex=0x75bfaf48(1198295875584, 3000865, 8147, 6)
Bucket: #=123 Mutex=0x75bfb098(1198295875584, 2, 0, 6)
Bucket: #=126 Mutex=0x75bfb128(1198295875584, 2000622, 3340, 6)
Bucket: #=141 Mutex=0x75bfb3f8(1198295875584, 3000935, 11689, 6)
Bucket: #=154 Mutex=0x75bfb668(1198295875584, 2000579, 2747, 6)
Bucket: #=162 Mutex=0x75bfb7e8(1198295875584, 2000598, 2975, 6)
Bucket: #=180 Mutex=0x75bfbb48(1198295875584, 2000570, 3487, 6)
Bucket: #=192 Mutex=0x75bfbd88(1198295875584, 2000715, 53345, 6)
Bucket: #=195 Mutex=0x75bfbe18(1198295875584, 31, 0, 6)
--//轉儲的對象第2個值表示gets的數量,第3個值表示sleeps的數量。可以發現在Bucket:#=192之前的僅僅有1個很小(Bucket: #=123),
--//應該是測試會產生的對象。
--//單獨保存前面的P1值到文件h1.txt.
$ cat h1.txt | sort -n | paste -sd" "
  5  17  39  42  47  51  55  60  67  74   98 100 116 126 141 154 162 177 180 185 192
--//僅僅113,123沒有出現在h1.txt文件(123應該是後增加的,gets=2),而h1.txt 記錄的177,180 的bucket沒有對象,估計已經刷出共享池。

--//確實這樣,Bucket: #=5對象是一條sql語句(sql_id=0f212fup8n005),已經不存在了。
SYS@book> @ sharepool/shp4 0f212fup8n005 -1
HANDLE_TYPE            KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
---------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
parent handle address  000000006C307AA0 000000006C307AA0 SELECT /*+ OPT_PARAM                              0          0          0 00               00                        0          0          0         0          0 2861170693 0f212fup8n005      65535
--//僅僅父遊標句柄還在,其他都沒有了。*/

$ egrep "^Bucket|^    ObjectName" /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_4197.trc |head -48
Bucket: #=5 Mutex=0x75bf9a78(1198295875584, 3000888, 6134, 6)
    ObjectName:  Name=SELECT /*+ OPT_PARAM('_parallel_syspls_obey_force' 'false') */ S.SNAME, S.PNAME, S.PVAL1, S.PVAL2 FROM WRI$_OPTSTAT_AUX_HISTORY S WHERE S.SAVTIME = (SELECT /*+ no_unnest */ MIN(SB.SAVTIME) FROM SYS.WRI$_OPTSTAT_AUX_HISTORY SB WHERE SB.SAVTIME > :B1 )
Bucket: #=17 Mutex=0x75bf9cb8(1198295875584, 2000597, 2379, 6)
    ObjectName:  Name=CDB$ROOT.SYS.WRI$_ADV_COMPRESSION_T
Bucket: #=39 Mutex=0x75bfa0d8(1198295875584, 2000578, 3474, 6)
    ObjectName:  Name=SELECT /*+ ordered index(u) index(o) index(po) OPT_PARAM('_parallel_syspls_obey_force' 'false') */
Bucket: #=42 Mutex=0x75bfa168(1198295875584, 2000562, 3569, 6)
    ObjectName:  Name=CDB$ROOT.SYS.AWR_ROOT_RULE_SET
Bucket: #=47 Mutex=0x75bfa258(1198295875584, 2000588, 8769, 6)
    ObjectName:  Name=SELECT NVL(TO_NUMBER(EXTRACT(XMLTYPE(:B2 ), :B1 )), 0) FROM DUAL
Bucket: #=51 Mutex=0x75bfa318(1198295875584, 2000600, 7764, 6)
    ObjectName:  Name=LOCK TABLE "WRH$_LATCH" PARTITION ("WRH$_LATCH_1073777561_MXSN")  IN EXCLUSIVE MODE  NOWAIT
Bucket: #=55 Mutex=0x75bfa3d8(1198295875584, 2000583, 4032, 6)
    ObjectName:  Name=CDB$ROOT.SYS.WRH$_WAITSTAT_PK
Bucket: #=60 Mutex=0x75bfa4c8(1198295875584, 2000602, 3026, 6)
    ObjectName:  Name=CDB$ROOT.PUBLIC.AWR_CDB_CHANNEL_WAITS
Bucket: #=67 Mutex=0x75bfa618(1198295875584, 2000575, 3334, 6)
    ObjectName:  Name=BOOK01P.RTSCTX5e201d1b30d15a74805baf03f9c1ce6d Child:1
Bucket: #=74 Mutex=0x75bfa768(1198295875584, 3000880, 18732, 6)
    ObjectName:  Name=select inst_id,hxfil, decode(hxerr, 0,decode(bitand(fhsta, 1), 0,'NOT ACTIVE','ACTIVE'), 1,'FILE MISSING', 2,'OFFLINE NORMAL', 3,'NOT VERIFIED', 4,'FILE NOT FOUND', 5,'CANNOT OPEN FILE', 6,'CANNOT READ HEADER', 7,'CORRUPT HEADER', 8,'WRONG FILE TYPE', 9,'WRONG DATABASE', 10,'WRONG FILE NUMBER', 11,'WRONG FILE CREATE', 12,'WRONG FILE CREATE', 16,'DELAYED OPEN', 'UNKNOWN ERROR'), to_number(fhbsc),  to_date(fhbti,'MM/DD/RR HH24:MI:SS','NLS_CALENDAR=Gregorian'), con_id from x$kcvfhonl
    ObjectName:  Name=select /*+ FIRST_ROWS(1) PARALLEL("WRH$_SYSTEM_EVENT", 1) */ 1 from NO_CROSS_CONTAINER("SYS"."WRH$_SYSTEM_EVENT") PARTITION ("WRH$_SYSTEM_EVENT_1073777561_MXSN")  where ( (  (  ( "DBID" < 1073777561 )  )  OR  ( "DBID" = 1073777561 AND  ( "SNAP_ID" < 4633 )  )  ) ) and rownum < 2
Bucket: #=98 Mutex=0x75bfabe8(1198295875584, 2000584, 2588, 6)
    ObjectName:  Name=BOOK01P.346f70cda3227d855a05d824c5417817 Child:5
Bucket: #=100 Mutex=0x75bfac48(1198295875584, 2000564, 3009, 6)
    ObjectName:  Name=CDB$ROOT.SYS.WRI$_EMX_FILE_ID_SEQ
Bucket: #=113 Mutex=0x75bfaeb8(1198295875584, 2000601, 4520, 6)
    ObjectName:  Name=BOOK01P.SYS.PLITBLM
Bucket: #=116 Mutex=0x75bfaf48(1198295875584, 3000865, 8147, 6)
    ObjectName:  Name=SELECT XMLELEMENT( "meta", XMLATTRIBUTES( :B8 AS "dbid", :B7 AS "dbver", :B6 AS "snap1", :B5 AS "snap2", TO_CHAR(:B4 , :B2 ) AS "time1", TO_CHAR(:B3 , :B2 ) AS "time2", :B1 AS "duration", 'INSTANCE' AS "req" )) FROM DUAL
    ObjectName:  Name=CDB$ROOT.SYS.WRH$_TABLESPACE_STAT
Bucket: #=123 Mutex=0x75bfb098(1198295875584, 2, 0, 6)
    ObjectName:  Name=BOOK01P.95877b00d73cc02fa74b03d823535a0f Child:1
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Bucket: #=126 Mutex=0x75bfb128(1198295875584, 2000622, 3340, 6)
    ObjectName:  Name=BOOK01P.SYS.SCHEDULER$_WINDOW_DETAILS
Bucket: #=141 Mutex=0x75bfb3f8(1198295875584, 3000935, 11689, 6)
    ObjectName:  Name=select /*+ FIRST_ROWS(1) PARALLEL("WRH$_INSTANCE_RECOVERY", 1) */ 1 from NO_CROSS_CONTAINER("SYS"."WRH$_INSTANCE_RECOVERY") PARTITION ("WRH$_INSTANCE_RECOVERY_1073777561_MXSN")  where ( (  (  ( "DBID" > 1073777561 )  )  OR  ( "DBID" = 1073777561 AND  ( "SNAP_ID" >= 4633 OR "SNAP_ID" IS NULL  )  )  ) ) and rownum < 2
    ObjectName:  Name=CDB$ROOT.93e93a96b998f32c3c7f46d309c66e2c Child:0
Bucket: #=154 Mutex=0x75bfb668(1198295875584, 2000579, 2747, 6)
    ObjectName:  Name=BOOK01P.SYS.WRH$_SEG_STAT 1
Bucket: #=162 Mutex=0x75bfb7e8(1198295875584, 2000598, 2975, 6)
    ObjectName:  Name=BOOK01P.15884431093d45436056120745deca1e Child:0
Bucket: #=180 Mutex=0x75bfbb48(1198295875584, 2000570, 3487, 6)
    ObjectName:  Name=BOOK01P.74883158531f5451563af5c5330937e3 Child:0
Bucket: #=192 Mutex=0x75bfbd88(1198295875584, 2000715, 53345, 6)
    ObjectName:  Name=SELECT /*+ CONNECT_BY_FILTERING */ s.privilege# FROM sys.sysauth$ s        CONNECT BY s.grantee# = PRIOR s.privilege#                                 AND (s.privilege# > 0 OR s.privilege# = -352)                              START WITH (s.privilege# > 0 OR s.privilege# = -352) AND s.grantee# IN     (SELECT c1.privilege# FROM sys.codeauth$ c1 WHERE c1.obj# = :1)            UNION                                                                      SELECT c2.privilege# FROM sys.codeauth$ c2 WHERE c2.obj# = :2
Bucket: #=195 Mutex=0x75bfbe18(1198295875584, 31, 0, 6)
    ObjectName:  Name=BOOK01P.SYS.AWR_CDB_RSRC_PLAN
Bucket: #=212 Mutex=0x75bfc148(1198295875584, 30, 0, 6)

--//也就是除了sql語句,還有其他對象比如表,包等待。佔用了前面Bucket: #=192 。
--//這樣基本驗證我的推斷從library cache  bucket=0開始掃描。如果存在對象給對應的bucket加上mutex X。這樣掃描到bucket=192時
--//找到符合條件的記錄。

5.使用gdb跟蹤看看:

$ cat bucket_mutex.gdb
set pagination off
set logging file bucket_mutex.log
set logging overwrite on
set logging on
set $kmutexget = 1
set $kbucketget = 1

break kglGetBucketMutex
command
 silent
 printf "kglGetBucketMutex count %02d -- Bucket : %d, Location : %d (0x%x)\n", $kbucketget++ ,$rsi ,$r8d,$r8d
 continue
end

break kglGetMutex
command
 silent
 printf "kglGetMutex count %02d -- Mutex address : 0x%x, Location : %d (0x%x)\n", $kmutexget++ ,$rsi ,$r8d,$r8d
continue
end

define PrintkglMutexLocations
  set pagination off
  set $i = 0
  while $i < $arg0
    x /s *((uint64_t *)&kglMutexLocations + $i)
    set $i = $i + 1
  end
end

define pkglloc
set pagination off
 x /s *((uint64_t *)&kglMutexLocations + $arg0 - 1)
end

--//session 1:
SCOTT@book01p> @ spid
==============================
SID                           : 145
SERIAL#                       : 64193
PROCESS                       : 4284
SERVER                        : DEDICATED
SPID                          : 4286
PID                           : 49
P_SERIAL#                     : 8
KILL_COMMAND                  : alter system kill session '145,64193' immediate;
PL/SQL procedure successfully completed.

--//windows 1:
$ gdb -f -p 4286 -x bucket_mutex.gdb
(gdb) del break 2

--//session 1:
SCOTT@book01p> @ loop.txt 1
PL/SQL procedure successfully completed.

--//windows 1:
Breakpoint 1 at 0x15370830
(gdb) c
Continuing.
kglGetBucketMutex count 01 -- Bucket : 5, Location : 49 (0x31)
kglGetBucketMutex count 02 -- Bucket : 5, Location : 145 (0x91)
kglGetBucketMutex count 03 -- Bucket : 17, Location : 49 (0x31)
kglGetBucketMutex count 04 -- Bucket : 17, Location : 145 (0x91)
kglGetBucketMutex count 05 -- Bucket : 39, Location : 49 (0x31)
kglGetBucketMutex count 06 -- Bucket : 39, Location : 145 (0x91)
kglGetBucketMutex count 07 -- Bucket : 47, Location : 49 (0x31)
kglGetBucketMutex count 08 -- Bucket : 47, Location : 145 (0x91)
kglGetBucketMutex count 09 -- Bucket : 55, Location : 49 (0x31)
kglGetBucketMutex count 10 -- Bucket : 55, Location : 145 (0x91)
kglGetBucketMutex count 11 -- Bucket : 67, Location : 49 (0x31)
kglGetBucketMutex count 12 -- Bucket : 67, Location : 145 (0x91)
kglGetBucketMutex count 13 -- Bucket : 74, Location : 49 (0x31)
kglGetBucketMutex count 14 -- Bucket : 74, Location : 145 (0x91)
kglGetBucketMutex count 15 -- Bucket : 78, Location : 49 (0x31)
kglGetBucketMutex count 16 -- Bucket : 78, Location : 145 (0x91)
kglGetBucketMutex count 17 -- Bucket : 98, Location : 49 (0x31)
kglGetBucketMutex count 18 -- Bucket : 98, Location : 145 (0x91)
kglGetBucketMutex count 19 -- Bucket : 100, Location : 49 (0x31)
kglGetBucketMutex count 20 -- Bucket : 100, Location : 145 (0x91)
kglGetBucketMutex count 21 -- Bucket : 102, Location : 49 (0x31)
kglGetBucketMutex count 22 -- Bucket : 102, Location : 145 (0x91)
kglGetBucketMutex count 23 -- Bucket : 113, Location : 49 (0x31)
kglGetBucketMutex count 24 -- Bucket : 113, Location : 145 (0x91)
kglGetBucketMutex count 25 -- Bucket : 116, Location : 49 (0x31)
kglGetBucketMutex count 26 -- Bucket : 116, Location : 145 (0x91)
kglGetBucketMutex count 27 -- Bucket : 116, Location : 145 (0x91)
kglGetBucketMutex count 28 -- Bucket : 120, Location : 49 (0x31)
kglGetBucketMutex count 29 -- Bucket : 120, Location : 145 (0x91)
kglGetBucketMutex count 30 -- Bucket : 123, Location : 49 (0x31)
kglGetBucketMutex count 31 -- Bucket : 123, Location : 145 (0x91)
kglGetBucketMutex count 32 -- Bucket : 126, Location : 49 (0x31)
kglGetBucketMutex count 33 -- Bucket : 126, Location : 145 (0x91)
kglGetBucketMutex count 34 -- Bucket : 141, Location : 49 (0x31)
kglGetBucketMutex count 35 -- Bucket : 141, Location : 145 (0x91)
kglGetBucketMutex count 36 -- Bucket : 143, Location : 49 (0x31)
kglGetBucketMutex count 37 -- Bucket : 143, Location : 145 (0x91)
kglGetBucketMutex count 38 -- Bucket : 159, Location : 49 (0x31)
kglGetBucketMutex count 39 -- Bucket : 159, Location : 145 (0x91)
kglGetBucketMutex count 40 -- Bucket : 159, Location : 145 (0x91)
kglGetBucketMutex count 41 -- Bucket : 192, Location : 49 (0x31)
kglGetBucketMutex count 42 -- Bucket : 192, Location : 145 (0x91)
--//基本驗證我前面的判斷。

(gdb) pkglloc 0x31
0x17adb5b8:     "kglic1    49"
(gdb) pkglloc 0x91
0x17adbc10:     "kglic4       145"

--//而普通sql語句的情況:
select * from dept where deptno=20;
SCOTT@book01p> @ hashz
HASH_VALUE SQL_ID        CHILD_NUMBER KGL_BUCKET HASH_HEX   SQL_EXEC_START      SQL_EXEC_ID
---------- ------------- ------------ ---------- ---------- ------------------- -----------
  95129850 80baj2c2ur47u            0     102650   5ab90fa  2025-07-27 12:08:18    16777221
--//KGL_BUCKET=102650
--//執行4次,gdb檢測情況如下:

Breakpoint 1 at 0x15370830
--//第1次執行:
(gdb) c
Continuing.
kglGetBucketMutex count 01 -- Bucket : 102650, Location : 62 (0x3e)
kglGetBucketMutex count 02 -- Bucket : 102650, Location : 62 (0x3e)
kglGetBucketMutex count 03 -- Bucket : 72611, Location : 64 (0x40)
kglGetBucketMutex count 04 -- Bucket : 72135, Location : 64 (0x40)
kglGetBucketMutex count 05 -- Bucket : 31441, Location : 62 (0x3e)
kglGetBucketMutex count 06 -- Bucket : 102650, Location : 177 (0xb1)
kglGetBucketMutex count 07 -- Bucket : 102650, Location : 179 (0xb3)
kglGetBucketMutex count 08 -- Bucket : 72611, Location : 64 (0x40)
kglGetBucketMutex count 09 -- Bucket : 72135, Location : 64 (0x40)
kglGetBucketMutex count 10 -- Bucket : 23529, Location : 62 (0x3e)
kglGetBucketMutex count 11 -- Bucket : 72611, Location : 64 (0x40)
kglGetBucketMutex count 12 -- Bucket : 72135, Location : 64 (0x40)
kglGetBucketMutex count 13 -- Bucket : 98828, Location : 62 (0x3e)
kglGetBucketMutex count 14 -- Bucket : 55783, Location : 62 (0x3e)
kglGetBucketMutex count 15 -- Bucket : 69906, Location : 62 (0x3e)
kglGetBucketMutex count 16 -- Bucket : 89962, Location : 62 (0x3e)
kglGetBucketMutex count 17 -- Bucket : 60655, Location : 62 (0x3e)
kglGetBucketMutex count 18 -- Bucket : 96279, Location : 62 (0x3e)
kglGetBucketMutex count 19 -- Bucket : 97795, Location : 62 (0x3e)
kglGetBucketMutex count 20 -- Bucket : 127944, Location : 62 (0x3e)
kglGetBucketMutex count 21 -- Bucket : 10224, Location : 62 (0x3e)
kglGetBucketMutex count 22 -- Bucket : 24312, Location : 62 (0x3e)
kglGetBucketMutex count 23 -- Bucket : 36799, Location : 62 (0x3e)
kglGetBucketMutex count 24 -- Bucket : 94595, Location : 62 (0x3e)
kglGetBucketMutex count 25 -- Bucket : 124988, Location : 62 (0x3e)
kglGetBucketMutex count 26 -- Bucket : 20307, Location : 62 (0x3e)
kglGetBucketMutex count 27 -- Bucket : 106042, Location : 62 (0x3e)
kglGetBucketMutex count 28 -- Bucket : 95710, Location : 62 (0x3e)
kglGetBucketMutex count 29 -- Bucket : 59063, Location : 62 (0x3e)
kglGetBucketMutex count 30 -- Bucket : 95710, Location : 179 (0xb3)
kglGetBucketMutex count 31 -- Bucket : 110580, Location : 62 (0x3e)
kglGetBucketMutex count 32 -- Bucket : 113172, Location : 62 (0x3e)
kglGetBucketMutex count 33 -- Bucket : 113172, Location : 62 (0x3e)
kglGetBucketMutex count 34 -- Bucket : 105175, Location : 62 (0x3e)
kglGetBucketMutex count 35 -- Bucket : 21761, Location : 62 (0x3e)
kglGetBucketMutex count 36 -- Bucket : 59274, Location : 62 (0x3e)
kglGetBucketMutex count 37 -- Bucket : 106042, Location : 62 (0x3e)
--//第2次執行:
kglGetBucketMutex count 38 -- Bucket : 102650, Location : 62 (0x3e)
--//第3次執行:
kglGetBucketMutex count 39 -- Bucket : 102650, Location : 62 (0x3e)
--//第4次執行,沒有輸出,sql語句已經緩存,繞過了kglGetBucketMutex。

--//順便提一下如果在cdb上執行@loop.txt 1,輸出如下,前面多訪問Bucket=72611。
(gdb) c
Continuing.
kglGetBucketMutex count 18 -- Bucket : 72611, Location : 64 (0x40)
kglGetBucketMutex count 19 -- Bucket : 72611, Location : 64 (0x40)
kglGetBucketMutex count 20 -- Bucket : 5, Location : 49 (0x31)
kglGetBucketMutex count 21 -- Bucket : 5, Location : 145 (0x91)
kglGetBucketMutex count 22 -- Bucket : 14, Location : 49 (0x31)
kglGetBucketMutex count 23 -- Bucket : 14, Location : 145 (0x91)
kglGetBucketMutex count 24 -- Bucket : 17, Location : 49 (0x31)
kglGetBucketMutex count 25 -- Bucket : 17, Location : 145 (0x91)
kglGetBucketMutex count 26 -- Bucket : 39, Location : 49 (0x31)
kglGetBucketMutex count 27 -- Bucket : 39, Location : 145 (0x91)
kglGetBucketMutex count 28 -- Bucket : 45, Location : 49 (0x31)
kglGetBucketMutex count 29 -- Bucket : 45, Location : 145 (0x91)
kglGetBucketMutex count 30 -- Bucket : 47, Location : 49 (0x31)
kglGetBucketMutex count 31 -- Bucket : 47, Location : 145 (0x91)
--//前面多了一次訪問Bucket : 72611,每次執行都是如此。

--//查看轉儲,訪問對象是CDB$ROOT.SYS.book。
Bucket: #=72611 Mutex=0x75f4d9c8(1198295875584, 25094, 3, 6)
  LibraryHandle:  Address=0x72e5c260 Hash=a6411ba3 LockMode=0 PinMode=0 LoadLockMode=0 Status=0 Subpool=1
    ObjectName:  Name=CDB$ROOT.SYS.book
      FullHashValue=b885bb910059a4d2fdbfc245a6411ba3 Namespace=DBINSTANCE(74) Type=CURSOR(00) ContainerId=1 ContainerUid=1 Identifier=1 OwnerIdn=0
    Statistics:  InvalidationCount=0 ExecutionCount=0 LoadCount=0 ActiveLocks=0 TotalLockCount=25071 TotalPinCount=0
    Counters:  BrokenCount=1 RevocablePointer=1 KeepDependency=0 Version=0 BucketInUse=1 HandleInUse=1 HandleReferenceCount=0
    Concurrency:  DependencyMutex=0x72e5c310(0, 0, 0, 0) Mutex=0x72e5c3b8(279, 50165, 0, 6)
    Flags=RON/PIN/KEP/BSO/[00810003] Flags2=[0000]
    WaitersLists:
      Lock=0x72e5c2f0[0x72e5c2f0,0x72e5c2f0]
      Pin=0x72e5c2d0[0x72e5c2d0,0x72e5c2d0]
      LoadLock=0x72e5c348[0x72e5c348,0x72e5c348]
    Timestamp:
    HandleReference:  Address=0x72e5c438 Handle=(nil) Flags=[00]

6.特殊測試:
--//我以前為了測試需要收集了一些特殊sql語句,其KGL_BUCKET=0。
select /*+ 9 */ count(*) from dept where deptno = 93834;
select /*+ 9 */ count(*) from dept where deptno = 93091;

--//先執行以上語句多次,重複測試。這樣P1應該僅僅看到0的情況。

$ zzdate ; seq 50 | xargs -P 50 -IQ sqlplus scott/book@book01p @record.txt 2e4 aaaa loop.txt > /dev/null; zzdate
trunc(sysdate)+12/24+23/1440+49/86400 1753590229.274249982
trunc(sysdate)+12/24+24/1440+01/86400 1753590241.099016484

SYS@book> @ ashtop event,sql_id 1=1 trunc(sysdate)+12/24+23/1440+49/86400 trunc(sysdate)+12/24+24/1440+01/86400
    Total                                                                                                                    Distinct Distinct    Distinct
  Seconds     AAS %This   EVENT                                      SQL_ID        FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ------------------------------------------ ------------- ------------------- ------------------- ---------- -------- -----------
      344    28.7   84% | library cache: bucket mutex X              6s0qhxyxjpurx 2025-07-27 12:23:50 2025-07-27 12:24:00        344       11         344
       42     3.5   10% |                                            6s0qhxyxjpurx 2025-07-27 12:23:50 2025-07-27 12:23:58         41        9          42
        9      .7    2% |                                            fm1tb5mss6fsj 2025-07-27 12:23:51 2025-07-27 12:23:56          9        5           9
        6      .5    1% | library cache: mutex X                     6s0qhxyxjpurx 2025-07-27 12:23:51 2025-07-27 12:24:00          6        5           6
        3      .2    1% |                                                          2025-07-27 12:23:49 2025-07-27 12:23:56          1        3           3
        2      .2    0% | cursor: pin S                                            2025-07-27 12:23:52 2025-07-27 12:23:55          1        2           2
        1      .1    0% | cursor: pin S                              6s0qhxyxjpurx 2025-07-27 12:23:55 2025-07-27 12:23:55          1        1           1
        1      .1    0% | log file sync                                            2025-07-27 12:23:51 2025-07-27 12:23:51          1        1           1
8 rows selected.

SYS@book> @ ashtop event,p1raw,p1,p3raw "event='library cache: bucket mutex X'" trunc(sysdate)+12/24+23/1440+49/86400 trunc(sysdate)+12/24+24/1440+01/86400
    Total                                                                                                                                                     Distinct Distinct    Distinct
  Seconds     AAS %This   EVENT                                      P1RAW                     P1 P3RAW             FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ------------------------------------------ ----------------- ---------- ----------------- ------------------- ------------------- ---------- -------- -----------
      190    15.8   55% | library cache: bucket mutex X              0000000000000000           0 0000000000000031  2025-07-27 12:23:50 2025-07-27 12:24:00        190       11         190
      154    12.8   45% | library cache: bucket mutex X              0000000000000000           0 0000000000000091  2025-07-27 12:23:50 2025-07-27 12:24:00        154       11         154

7.繼續測試:
--//修改loop.txt 腳本,僅僅訪問v$session視圖看看:
declare
v_count number;
begin
    for i in 1 .. &&1 loop
        select count(*) into v_count from v$session ;
        --select count(*) into v_count from v$sql ;
        --//select count(*) into v_count from v$sql where rownum<=1;
    end loop;
end ;
/

$ zzdate ; seq 50 | xargs -P 50 -IQ sqlplus scott/book@book01p @record.txt 1e4 aaaa loop.txt > /dev/null; zzdate
trunc(sysdate)+12/24+26/1440+54/86400 1753590414.086612651
trunc(sysdate)+12/24+27/1440+24/86400 1753590444.014456173

SYS@book> @ ashtop event,sql_id 1=1 trunc(sysdate)+12/24+26/1440+54/86400 trunc(sysdate)+12/24+27/1440+24/86400
    Total                                                                                                                    Distinct Distinct    Distinct
  Seconds     AAS %This   EVENT                                      SQL_ID        FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ------------------------------------------ ------------- ------------------- ------------------- ---------- -------- -----------
     1173    39.1   95% |                                            6yrc6byy4fkdh 2025-07-27 12:26:54 2025-07-27 12:27:23       1163       30        1169
       26      .9    2% | cursor: pin S                                            2025-07-27 12:27:02 2025-07-27 12:27:14          1        3           3
       21      .7    2% |                                            6p2rfss035gya 2025-07-27 12:26:55 2025-07-27 12:27:22         20       13          20
       19      .6    2% |                                                          2025-07-27 12:26:55 2025-07-27 12:27:18          1       13          13
        1      .0    0% | cursor: pin S                              6yrc6byy4fkdh 2025-07-27 12:27:19 2025-07-27 12:27:19          1        1           1
--//這次就看不到library cache: bucket mutex X 等待事件。主要消耗CPU外集中在cursor: pin S。

--//估計如果底層視圖涉及x$kgl開頭的表都存在類似情況。
SYS@book> @ xt x$kgl
   INST_ID NAME                            OBJECT_ID TYPE     TABLE_NUM     CON_ID
---------- ------------------------------ ---------- ------- ---------- ----------
         1 X$KGLSIM                       4294951882 TABLE           98          0
         1 X$KGLJSIM                      4294951994 TABLE           99          0
         1 X$KGLMEM                       4294951885 TABLE          100          0
         1 X$KGLJMEM                      4294951997 TABLE          101          0
         1 X$KGLOB                        4294950985 TABLE          665          0
         1 X$KGLOBXML                     4294953144 TABLE          666          0
         1 X$KGLLK                        4294950986 TABLE          667          0
         1 X$KGLPN                        4294950987 TABLE          668          0
         1 X$KGLST                        4294950988 TABLE          669          0
         1 X$KGLAU                        4294951112 TABLE          670          0
         1 X$KGLSN                        4294951379 TABLE          671          0
         1 X$KGLTR                        4294951033 TABLE          672          0
         1 X$KGLXS                        4294951034 TABLE          673          0
         1 X$KGLRD                        4294951187 TABLE          674          0
         1 X$KGLDP                        4294951035 TABLE          675          0
         1 X$KGLNA                        4294951064 TABLE          676          0
         1 X$KGLNA1                       4294951150 TABLE          677          0
         1 X$KGLTABLE                     4294951056 TABLE        65537          0
         1 X$KGLBODY                      4294951057 TABLE        65537          0
         1 X$KGLTRIGGER                   4294951058 TABLE        65537          0
         1 X$KGLINDEX                     4294951059 TABLE        65537          0
         1 X$KGLCLUSTER                   4294951060 TABLE        65537          0
         1 X$KGLCURSOR                    4294951061 TABLE        65537          0
         1 X$KGLCURSOR_CHILD_SQLID        4294952684 TABLE        65537          0
         1 X$KGLCURSOR_CHILD_SQLIDPH      4294952680 TABLE        65537          0
         1 X$KGLCURSOR_CHILD              4294952683 TABLE        65537          0
         1 X$KGLCURSOR_PARENT             4294953372 TABLE        65537          0
         1 X$KGLSQLTXL                    4294953759 TABLE        65537          0
28 rows selected.

8.總結:

--//1.注意library cache: bucket mutex X與library cache: mutex X的區別,以前11g版本(包含11g)都是library cache: mutex X,
--//可以結合p1raw,p3raw判斷。
--//2.一些訪問以底層視圖x$kgl開頭的視圖,會出現library cache: bucket mutex X,掃描方法與我前面介紹類似。在生產系統應該盡
--//量規避這類掃描操作。像一些垃圾監控訪問v$sqlarea 排序取物理讀以及邏輯讀和執行時間最多的語句根本沒必要,主要生產系統共
--//享池一般都非常大,掃描1次需要花費大量時間。
--//3.如果需要訪問儘可能通過x$索引.

SYS@book> @ xind x$kglcursor_child,x$kglob

DERIVED_TABLES                 TABLE_NAME                     INDEX_NUMBER COLUMN_NAME                    COLUMN_POSITION     CON_ID
------------------------------ ------------------------------ ------------ ------------------------------ --------------- ----------
                               X$KGLOB                                   1 KGLNAHSH                                     0          0
                               X$KGLOB                                   2 KGLOBT03                                     0          0

DERIVED_TABLES                 TABLE_NAME                     INDEX_NUMBER COLUMN_NAME                    COLUMN_POSITION     CON_ID
------------------------------ ------------------------------ ------------ ------------------------------ --------------- ----------
X$KGLCURSOR_CHILD              X$KGLOB                                   1 KGLNAHSH                                     0          0
X$KGLCURSOR_CHILD              X$KGLOB                                   2 KGLOBT03                                     0          0

--//比如訪問v$sql通過sql_id或者hash_value都很快,大家可以前面gdb腳本測試:
SCOTT@book01p> select * from dept where deptno=20;
    DEPTNO DNAME                          LOC
---------- ------------------------------ -------------
        20 RESEARCH                       DALLAS

SCOTT@book01p> @ hashz

HASH_VALUE SQL_ID        CHILD_NUMBER KGL_BUCKET HASH_HEX   SQL_EXEC_START      SQL_EXEC_ID
---------- ------------- ------------ ---------- ---------- ------------------- -----------
  95129850 80baj2c2ur47u            0     102650   5ab90fa  2025-07-27 16:39:50    16777221


SCOTT@book01p> select sql_id,sql_text from v$sql where sql_id='80baj2c2ur47u';
SQL_ID        SQL_TEXT
------------- ------------------------------------------------------------
80baj2c2ur47u select * from dept where deptno=20

(gdb) del break 2
(gdb) c
Continuing.
kglGetBucketMutex count 03 -- Bucket : 102650, Location : 49 (0x31)
kglGetBucketMutex count 04 -- Bucket : 102650, Location : 145 (0x91)

SCOTT@book01p> select sql_id,sql_text from v$sql where hash_value=95129850;
SQL_ID        SQL_TEXT
------------- ------------------------------------------------------------
80baj2c2ur47u select * from dept where deptno=20

--//gdb輸出。
kglGetBucketMutex count 32 -- Bucket : 90919, Location : 62 (0x3e)
kglGetBucketMutex count 33 -- Bucket : 102650, Location : 49 (0x31)
kglGetBucketMutex count 34 -- Bucket : 102650, Location : 145 (0x91)

kglGetBucketMutex count 35 -- Bucket : 102650, Location : 49 (0x31)
kglGetBucketMutex count 36 -- Bucket : 102650, Location : 145 (0x91)
--//有點懷疑其實根本沒有怎麼索引,僅僅通過sql_id,hash_value 推導出bucket的值。
--//95129850%2^17 = 102650

SCOTT@book01p> @ xtoy 80baj2c2ur47u 32 16
BASE32                         BASE16                         BASE10
------------------------------ ------------------------------ ------------------------------
80baj2c2ur47u                  802d511305ab90fa               9236127552948113658
--//base16=802d511305ab90fa.

(gdb) p/d 0x802d511305ab90fa & 0xffffffff
$2 = 95129850

(gdb) p/d 0x802d511305ab90fa & 0x1ffff
$1 = 102650

--//前面出現Bucket : 90919對應sql語句,再次執行就不出現了。
SYS@book> select sql_id ,hash_value,mod(hash_value,power(2,17)) from v$sql where  mod(hash_value,power(2,17))= 90919;
SQL_ID        HASH_VALUE MOD(HASH_VALUE,POWER(2,17))
------------- ---------- ---------------------------
ddayh21y4kst7 2085184295                       90919

SYS@book> @ sql_id ddayh21y4kst7
-- SQL_ID = ddayh21y4kst7 come from shared pool
select sql_id,sql_text from v$sql where hash_value=95129850;

9.附上測試使用腳本:

$ cat xt.sql
-- Copyright 2023 lfree. All rights reserved.
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms and conditions.
--------------------------------------------------------------------------------
--
-- File name:   xt.sql
-- Purpose:     query x$ table
-- Author:      lfree
--
-- Usage:
--     @ xt <regexp_like_string>
--     replace middle $ using \$ , last $ do not replace.
--------------------------------------------------------------------------------
set termout off
column column_string new_value column_string format a200
--select replace('&1','$','\$') column_string from dual;
select decode(instr(reverse('&1'),'$'),1, replace(substr('&&1',1,length('&&1')-1),'$','\$')||'$' , replace('&1','$','\$')) column_string from dual;
set termout on

select * from gv$fixed_table where regexp_like (name,'&column_string','i');


 $ cat xind.sql
-- Copyright 2023 lfree. All rights reserved.
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms and conditions.
--------------------------------------------------------------------------------
--
-- File name:   xind.sql
-- Purpose:     query X$ index
-- Author:      lfree
--
-- Usage:
--     @ xind <x$table_name,...>
--     @ xind <x$kglob,x$kgldp>
--------------------------------------------------------------------------------
set termout off
column column_string new_value column_string format a200
--select decode('&1','','1=1','1','1=1','1=1','1=1','table_name in ('||''''||replace(upper('&1'),',',''',''')||''')' ) column_string1 from dual ;
--select decode('&1','','1=1','1','1=1','1=1','1=1',''''||replace(upper('&1'),',',''',''')||'''') column_string from dual ;
select ''''||replace(upper('&1'),',',''',''')||'''' column_string from dual ;
set termout on

--//select * from V$INDEXED_FIXED_COLUMN where 1=1 and table_name in (&column_string);
set feedback off
column derived_tables format a30
SELECT NULL derived_tables, V$INDEXED_FIXED_COLUMN.*
  FROM V$INDEXED_FIXED_COLUMN
 WHERE 1 = 1 AND  table_name in (&column_string)
-- WHERE 1 = 1 AND  regexp_like (table_name ,upper('&1'))
;

SELECT x$kqfdt.KQFDTNAM derived_tables, V$INDEXED_FIXED_COLUMN.*
  FROM V$INDEXED_FIXED_COLUMN, x$kqfdt
 WHERE  1 = 1
       AND V$INDEXED_FIXED_COLUMN.table_name = x$kqfdt.KQFDTEQU
       AND x$kqfdt.kqfdtnam in (&column_string)
--     AND regexp_like ( x$kqfdt.kqfdtnam ,upper('&1'))
order by x$kqfdt.KQFDTNAM ,INDEX_NUMBER
;
prompt
set feedback 6

Add a new 评论

Some HTML is okay.