首页 > 其他分享 >gbase8s的select查询数据物理位置寻址分析和学习

gbase8s的select查询数据物理位置寻址分析和学习

时间:2024-06-15 23:29:50浏览次数:17  
标签:test1 slot 逻辑 gbase8s 16 chunk 寻址 区段 select

1. 执行的sql语句和目的

  • 执行的sql语句
 select rowid,* from test1 where id=1;
  • 目的:查找到test1表中id=1这个值在硬盘中的真实位置并取出

2. 寻址的过程-确定表的数据空间和逻辑页的信息

  • 根据表名查看这张表的数据空间位置和逻辑页号
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ dbaccess test -
Your evaluation license will expire on 2025-05-26 00:00:00

Database selected.

> select hex(partnum) from systables where tabname ='test1';


(expression)

0x00400049

1 row(s) retrieved.
  • 每个表都有一个唯一的partnum,可以成为分片标识号,其记录了这张表在磁盘中的信息,其转为16进制后,前3位为数据空间号,后5位为逻辑页的地址
    • 0x004表示这张表位于标识为4的chunk中
    • 0x00049记录了这张表在这个chunk中逻辑页的位置,16进制的49转为10进制为73
    • 则16进制的partnum表示test1表位于第4个chunk的第73个逻辑页

3. 根据逻辑页找到表区段位置的过渡知识

  • 寻址中所需对象的概念
    • 操作系统的页和数据库中的逻辑页:操作系统中页默认是2kb,本次查询的数据库页大小设计为16k,所以逻辑页进行计算并确认物理页位置的时候需要用逻辑页*16kb/2kb,这是逻辑页和物理页在计算中的映射,下面会用到
    • extent:数据存放在页中,但是一张表扩展时不会只扩展一页,而是多个连续的页进行扩展,而这些连续的页,我们称之为区段extent
    • tblspace:由extent可知,一个表是由多个extent组成的,而一张表所有的extent的总和,我们称之为一张表的tblspace,即这张表的表空间
    • tblspace tblspace:由于每张表都有多个extent组成,为了快速定位表的每个extent,所以在chunk的头部空间内,有部分页,就是为了保存这部分信息的,每个页都记录了一张表所有extent的起始位置信息,而这些页的组合我们称之为tblspace tblspace
      • 既然每个tblspace都有一个空间用来记录extent的起始位置信息,而tblspace tblspace这一组表空间我们也看成一张表,而这张表也有自己的空间信息,且位置就在这个表的前两页(类似与前两行),即page 0和page 1,page 1就记录了这个空间关于表位置的信息
      • 所以如果寻找表的位置,可以从tblspace tblspace的page 1中进行查询
      • page 0是位图页,左右可从其他文章中查找,本文不进行叙述,但是会在下文展示

4. 根据partnum的tblspace tblspace的page 1查找test1表的区段信息

  • oncheck -pp可以打印某个表空间的逻辑页
  • tblspace tblspace在数据中是一个chunk的第一个表空间
  • 由test1的partnum可知test1在第四个chunk中,则记录test1的区段信息的tblspace tblspace的逻辑空间为0x400001,则oncheck -pp 0x400001 1即可计算出test1的物理页位置
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ oncheck -pp 0x400001 0
Your evaluation license will expire on 2025-05-26 00:00:00
addr             stamp    chksum nslots flag type         frptr frcnt next     prev
4:24             2420340  ee4c   0      804  FREE         24    16356 0        0
   0:8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
  32:8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
  64:8 8 8 8 8 8 8 8 8 8 8 8 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  96:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 128:8 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 160:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 192:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  • 查看记录表区段的页
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ oncheck -pp 0x400001 1
Your evaluation license will expire on 2025-05-26 00:00:00
addr             stamp    chksum nslots flag type         frptr frcnt next     prev
4:32             2420408  eeb8   5      802  PARTN        228   16132 0        0
        slot ptr   len   flg
        1    24    136   0
        2    160   28    0
        3    188   0     0
        4    188   0     0
        5    188   40    0
slot   1:
    0:  1  0 40  0  1 28  0  0 88  0  0  0  0  0  0  0   ..@..(..........
   16:  3  0  0 40 ca 6d 59 66  1  0  0  0 90  1  0  0   ...@JmYf........
   32: 40  6  0  0 c8  0  0  0 97  0  0  0  0  0  0  0   @...H...........
   48: ff ff ff ff  1  0 40  0  1  0  0  0  0  0  0  0   ......@.........
   64:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0   ................
   80:  0  0  0  0  0  0  0  0 4e  0  0  0  1  0  0  0   ........N.......
   96:  0  0  0  0  1  0  0  0  1  0  0  0  0  0  0  0   ................
  112:  1  0  0  0  5  0  0  0 d0 b0 44  0  0  0  0  0   ........P0D.....
  128:  0  0  0  0  0  0  0  0                           ................
slot   2:
    0: 64 61 74 61 64 62 73 31  0 67 62 61 73 65 64 62   datadbs1.gbasedb
   16: 74  0 54 42 4c 53 70 61 63 65  0  0               t.TBLSpace......
slot   3:
slot   4:
slot   5:
    0:  0  0  0  0  0  4  0  0  0 18  0  0  0 32  0  4   .............2..
   16:  0  0  8 48  0  0  0 64  0  4  0  0 16 b8  0  0   ...H...d.....8..
   32:  0 c8  0  0  0  0  0  0                           .H..............
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$

由oncheck -pp 0x400001 1可知物理地址和逻辑地址如下

  • slot 1记录了表的基本信息,字段数量、索引数量等
  • slot 2记录了数据库数据库名,表的所有者、表名和方言等信息
  • slot 3记录了特殊字段的信息
  • slot 4:记录索引的相关键值信息
  • slot 5记录了区段列表的信息
  • 解析slot 5:
    • 0:表示从0个字节开始:0 0 0 0代表逻辑页0,0 4代表chunk 4,0 0 0 18,16进制的18代表24页
      • 由前10位可以得出第一个区段的起始逻辑页为0 ,而逻辑页0的物理位置为chunk4的第24页
    • 16:表示从第16个字节开始,0 0 0 32,16进制32为50,代表起始页为50,0 4代表chunk 4,0 0 8 48,16进制848为2120
      • 由第二个10位可以得出第二个区段的起始逻辑页号为50,逻辑页50对应的物理位置为chunk4的2120页
    • 32:表示从第32个字节开始,0 0 0 64,16进制64代表100,代表逻辑页100,0 4 0 0 16 b8,代表chunk4 5816页
      • 由第三个10位可以得出第三个区段起始页是100,而逻辑页100对应的物理位置为chunk4的5816页
    • 第四个10发现后6位全为0,表示第四个chunk还没有申请,表示所有的数据tblspace的信息都被记录在了前三个chunk中

5. 针对test1的partnum和tblspace tblspace关于表信息区段进行计算

  • 已知test1的partnum为0x00400049,转为16进制后分析为chunk4的第73个逻辑页
  • 根据tblspace tblspace中的解析可知
    • 有三个区段,起始位置为0页,50页,100页
    • 而test1的逻辑页为73页,所以其信息位于第二个区段内,又因为区段里的页是连续的,所以73页可以根据50页的位置进行计算得出来
  • 计算:
    • 由于逻辑页50对应的物理页数为2120页,则逻辑页73需要在逻辑页50上加上23逻辑页,即在2120页上加上相应的物理页
    • 因为是16kb的数据空间,2kb的操作系统空间,所以逻辑页的1页为操作系统物理页的8页,所以逻辑页73和逻辑页50页相差(73-50)*8=184页
    • 即逻辑73对应chunk4上的物理页2120+184=2304页
    • 所以可以从chunk 4上的2304页查出表test1数据的区段信息

6. 通过oncheck -pP根据chunk 4的2304页查看表test1的区段信息

  • oncheck -pP chunk page:可以根据这个参数写法查看出某个chunk的某个物理页上的信息
  • 执行命令oncheck -pP 4 2304
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ oncheck -pP 4 2304
Your evaluation license will expire on 2025-05-26 00:00:00
addr             stamp    chksum nslots flag type         frptr frcnt next     prev
4:2304           847006   e596   5      802  PARTN        212   16148 0        0
        slot ptr   len   flg
        1    24    136   0
        2    160   32    0
        3    192   0     0
        4    192   0     0
        5    192   20    0
slot   1:
    0: 49  0 40  0  1  8  0  0  4  0  0  0  0  0  0  0   I.@.............
   16:  1  0  0 40 29 60 5d 66  1  0  0  0 20  0  0  0   ...@)`]f.... ...
   32: 20  0  0  0  4  0  0  0  2  0  0  0  1  0  0  0    ...............
   48: ff ff ff ff 49  0 40  0  1  0  0  0  0  0  0  0   ....I.@.........
   64:  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0   ................
   80:  0  0  0  0  0  0  0  0  1  0  0  0  1  0  0  0   ................
   96:  0  0  0  0  1  0  0  0  1  0  0  0  0  0  0  0   ................
  112:  1  0  0  0  f  0  0  0 80 90 c0  8  0  0  0  0   ..........@.....
  128:  0  0  0  0  0  0  0  0                           ................
slot   2:
    0: 74 65 73 74  0 67 62 61 73 65 64 62 74  0 74 65   test.gbasedbt.te
   16: 73 74 31  0 7a 68 5f 43 4e 2e 35 37 33 37 32  0   st1.zh_CN.57372.
slot   3:
slot   4:
slot   5:
    0:  0  0  0  0  0  4  0  0 12 f8  0  0  0  4  0  0   .........x......
   16:  0  0  0  0                                       ................
  • slot5依然记录了区段信息,这个slot 5记录了test1表数据的区段信息
  • 数据区段起始页的计算:
    • 0 0 0 0:代表test1表数据存放的逻辑起始页为0
    • 0 4:代表test1表的数据存放在了chunk 4上
    • 0 0 12 f8:这是16进制的数字,转为10进制为4856,表示test1数据存放的逻辑页号0对应的chunk 4上的物理页号是第4856页
    • 再往后的0 0 0 4:表示第二个区段的逻辑页起始页为4,后面为0,表示第一个区段没有填充满,还没有使用第二个区段,即所有的数据都在第一个区段内

7. 根据区段信息进行下一步分析的理论信息

  • extent由上述可知是一组连续页的集合,而这组连续页的集合extent的第一个页也是一个位图页,位图页中的每个字节都是一个页的标识,每个标识的不同值是用来记录区段中的页是否被填充满,所以需要查找信息需要查看之后的页
  • 由上述信息可知,逻辑页每加一页物理页会加8页,则区段的起始页为chunk 4的4856页,extent的第二页为4864页
  • 本文执行的sql语句为select * from test1 where id=1
    • 本文已知test1的数据都在第一个extent中,也定位到了extent的其实物理位置
    • 接下来需要定位id=1的位置

8. 根据rowid定位id=1的位置

  • rowid转为16进制代表的是共4个字节8位,前6位记录的extent的逻辑页号,后两位记录的是slot号
    • slot:每个页gbase8s最多存储255行数据,即slot是行号,也最多是255,因为两位16进制最多是16*16-1=255
  • 对id=1的rowid进行16进制转换
--查看id=1的rowid
> select hex(rowid),rowid,id from test1 where id=1;


(expression)       rowid          id

0x00000101           257           1

1 row(s) retrieved.

Elapsed time: 0.001 sec

  • 由上可知id=1的数据在extent的逻辑页为1的第一行
  • 已知extent的起始物理页地址为chunk 4的4856页,由于extent的第一页是位图页,则数据的第一页为4856+8=4864页
  • 则id=1的物理地址为chunk4的第4864页第一行

9. 使用dd命令导出

[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ touch test1.page
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ dd if=/home/gbasedbt/gbase/node1_dbs/datadbs1 of=test1.page skip=608 count=1 bs=16k
1+0 records in
1+0 records out
16384 bytes (16 kB, 16 KiB) copied, 0.00012976 s, 126 MB/s
--查看导出来的数据
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ od -x test1.page
0000000 1300 0000 0004 f8ba 3801 0801 001c 3fdc
0000020 0000 0000 0000 0000 0000 0100 0000 0000
0000040 0000 0000 0000 0000 0000 0000 0000 0000
*
0037760 0000 0000 0000 0000 0018 0004 ebb2 000c
0040000
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$


  • dd命令参数解析
    • if:源文件,chunk 4的文件为/home/gbasedbt/gbase/node1_dbs/datadbs1,所以此参数的值为chunk 4的文件/home/gbasedbt/gbase/node1_dbs/datadbs1
    • of:是输出的目标端文件,本次是手动创建了一个文件test1.page
    • skip:跳过页数,也是起始页,由于id=1在物理位置的4864页,由于物理页大小为2kb,chunk文件的页大小为16k,所以物理4864/8=608,则物理的4864页在chunk 4上的608页
    • count:导出的页数量,由于id=1在逻辑页1上,则只导出1页即可
    • bs:表示文件的大小,chunk4为16KB
  • od进行查看:
    • 页内容涉及到了表上页表头信息等

标签:test1,slot,逻辑,gbase8s,16,chunk,寻址,区段,select
From: https://blog.csdn.net/qq_59083851/article/details/139691316

相关文章

  • MySql 中 select 使用
    MySqlselect多种查询方式前言在数据库使用过程中,使用最多的场景就是查询数据,所以今天我们总结一下常用用的查询简单查询带条件查询多条件查询输出指定字段查询分组查询查询结果排序分页查询多表之间查询准备三张表:订单orders商品commodity用户users内容如下:......
  • golang select {} 和 for {} 的区别
     select{}与for{}在Go语言中都是循环结构,但它们的行为和用途有所不同: select{}:是一个无限阻塞的select语句,没有指定任何case。主要用于等待通道操作或其他事件,在没有明确的通信或信号需求时保持运行状态。当程序需要在没有明确结束条件的情况下保......
  • 【前端求助帖】关于使用element-plus select 模板嵌套popover中使用select选择后,上一
    先看下效果主页代码如下项目使用的是Vue3+vite,下载后,直接pnpm i安装依赖, pnpmdev就是可以跑起来<el-buttontype="warning"round@click="openDia">打开弹框</el-button><el-dialogv-model="dialogTableVisible"title="业务"width=......
  • select()API
    编写TCP客户端和服务端程序,客户端通过多路IO复用同时处理标准输入(文件描述符为0)和套接字。当输入为quit时程序结束;当通过套接字收到对方消息时把收到的消息再次转发给对方,服务器端需通过select()监控listenfd和accept()后建立的新的套接字newfd,可只写select()相关的主要代码。  ......
  • java:【@Import】和【ImportSelector】的简单示例
    #代码结构#项目【myBeanBranch】【pom.xml】<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.15.RELEASE</version></dependency><dependency>......
  • Mamba: Linear-Time Sequence Modeling with Selective State Spaces
    目录概Mamba代码GuA.andDaoT.Mamba:Linear-timesequencemodelingwithselectivestatespaces.2023.概Mamba.MambaS4和S4D虽然解决了SSM计算速度的问题,但是有一个前提,就是\(A,B,C,D\)是与时间\(t\)无关的.这导致这些方法只能采取一种固定的模......
  • 计算机指令寻址的方式
    指令寻址想象一下,你手里有一本故事书,你一页一页地翻,这就是顺序寻址。你每次翻到下一页,就像电脑里的程序计数器(PC)自动跳到下一条指令。但是,如果故事书里有个提示说“跳到第50页”,这就是跳跃寻址。可能是故事的某个部分需要提前或者延后讲,电脑里的程序也会这样,通过一些特殊的......
  • 常见的数据寻址方式
    寄存器间接寻址:想象一下,你有一个信使(寄存器),他知道你想要的东西(操作数)放在哪里。你告诉信使去拿,但他得先看看地址本(寄存器里的地址信息)才知道东西具体在哪。这种方式挺快的,但信使可能要跑几趟,因为他得先查地址本,再去拿东西。相对寻址:这就像是你告诉信使,从当前位置(程序计数器......
  • 利用自定义标签,实现select下拉列表默认选中
    //创建块函数方法,用于替换文本中的值functionsmarty_block_get_cates($params,$content,&$_sm,&$repeat){if(!$repeat){$ci=&get_instance();$cates=$ci->db->get('category')->result_array();$cates=get_dat......
  • 服务器IO多路复用的select和poll的区别以及监听套接字select函数的四个宏操作
    目录知识补给站对文件描述符集合操作的四个宏操作服务器IO多路复用中的select和poll的区别知识补给站对文件描述符集合操作的四个宏操作对文件描述符集合操作的四个宏操作在select函数中起着关键的作用,它们用于初始化、添加、删除和检查文件描述符集合中的元素。这四个宏为:FD_......