云贝教育 |【技术文章共享池内存结构之SQL内存结构父子游标解析

2023年 12月 19日 81.7k 0

前言 

数据库版本:Version 19.3.0.0.0 

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

实验环境:PDB1 

SQL内存结构父子游标解析

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

一、SQL父游标解析 

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

x$kglob说明

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

• KGLHDADR 游标句柄地址 

• KGLNAOBJ 游标对应SQL信息 

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

1.2 做一个共享池全量dump 

 云贝教育 |【技术文章】共享池内存结构之SQL内存结构父子游标解析-1

1.3 查看父游标句柄对应的chunk 

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

通过724BC840去1.3中生成的trc文件中搜索
 云贝教育 |【技术文章】共享池内存结构之SQL内存结构父子游标解析-2

trc日志解析: 

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

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

• KGLHD表示它是KGL句柄 

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

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

1.4 查看父游标DS对应的chunk 

查看DS=000000006FB55C80 CHUNK信息,用6FB55C8去搜索
 云贝教育 |【技术文章】共享池内存结构之SQL内存结构父子游标解析-3

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

通过多次实验可以确认,DS头的地址与DS地址相差104字节
 云贝教育 |【技术文章】共享池内存结构之SQL内存结构父子游标解析-4

1.5 查看父游标堆0下的的chunk

 云贝教育 |【技术文章】共享池内存结构之SQL内存结构父子游标解析-1

KSMCHPTR=000000006F6A0E98就是父游标堆0真正的CHUNK了,继续找
 云贝教育 |【技术文章】共享池内存结构之SQL内存结构父子游标解析-6

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

二、SQL子游标解析

2.1 子游标句柄
 云贝教育 |【技术文章】共享池内存结构之SQL内存结构父子游标解析-7

通过地址6F68D8D去找子游标句柄
 云贝教育 |【技术文章】共享池内存结构之SQL内存结构父子游标解析-8

子游标句柄也是recretable类型,KGLHD表示它是句柄,大小560字节

同时子游标句柄在父游标堆0也可以找到对应的地址

2.2 查看子游标堆0描述地址、堆6描述地址

这里因为共享池设置的太小,导致子游标的堆0和堆6被覆盖了,进一步验证freeable最容易被覆盖

 云贝教育 |【技术文章】共享池内存结构之SQL内存结构父子游标解析-9

研究的方案和父游标一样,这样可以计算出一条SQL占用了哪些CHUNK,对共享池优化有进 一步的帮助。 

2.3 子游标堆0 DS信息

 云贝教育 |【技术文章】共享池内存结构之SQL内存结构父子游标解析-10

2.4 子游标堆6 DS信息

KGLOBHD0=000000006F6A1680

 

2.5 查看子游标堆0下的chunk

 

dupm相关信息

 

2.6 查看子游标堆6下的chunk

 
dupm相关信息
云贝教育 |【技术文章】共享池内存结构之SQL内存结构父子游标解析-11

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论