【YUNBEE云贝技术分享oracle共享池内存结构之SQL内存结构父子游标解析

前言

数据库版本:Version 19.3.0.0.0

操作系统版本:CentOS Linux release 7.6.1810 (Core)

实验环境:PDB1

一、SQL内存结构父子游标解析

以下实验,是连接到pdb下,硬解析一条SQL的过程

二、SQL父游标解析

2.1、查看SQL的父游标句柄地址和堆0描述地址

x$kglob说明• x$kglob记录SQL的游标句柄信息

• KGLHDADR 游标句柄地址

• KGLNAOBJ 游标对应SQL信息

• KGLOBHD0 父游标堆0对应的地址,其实它是父游标堆0的描述地址,记录父游标堆0下有哪些chunk

2.2 做一个共享池全量dump

2.3、查看父游标句柄对应的chunk

根据上面1.1中查的父游标句柄地址KGLHDADR=00000000724BC848

通过724BC840去1.3中生成的trc文件中搜索

trc日志解析:

• recrPT003表示它是一个recreate类型的chunk

• sz表示它的大小为816字节

• KGLHD表示它是KGL句柄

• 同时它是一个独立的CHUNK,不属于任何子堆

通过多次实验可以确认,句柄头的地址与句柄地址相关48字节

2.4、查看父游标DS对应的chunk

查看DS=000000006FB55C80 CHUNK信息,用6FB55C8去搜索

可以确认DS对应的chunk是freeable,大小为504字节,和父游标堆0不相邻

通过多次实验可以确认,DS头的地址与DS地址相差104字节

2.5、查看父游标堆0下的的chunk

KSMCHPTR=000000006F6A0E98就是父游标堆0真正的CHUNK了,继续找

ds 06fb55c80就是上面查的父游标DS地址

三、SQL子游标解析

3.1、子游标句柄

通过地址6F68D8D去找子游标句柄

 Chunk 06f68d8a8 sz= 560 recrPT003 "KGLHD "  Dump of memory from 0x000000006F68D8A8 to 0x000000006F68DAD8  06F68D8A0 00000231 80B38F00 [1.......]  06F68D8B0 6F68D690 00000000 00000000 00000000 [..ho............]  06F68D8C0 00000000 00000000 00000000 00000000 [................]  06F68D8D0 00000003 41080050 6F68D8D8 00000000 [....P..A..ho....]  #06F68D8E0 6F68D8D8 00000000 6F779848 00000000 [..ho....H.wo....]  06F68D8F0 00000000 00000000 00010000 10012111 [.............!..]  06F68D900 00000001 00000001 00010001 00000001 [................]  06F68D910 00000000 00000001 00010000 00000000 [................]