数据页大小 16k
1 创建数据库、表
create database test in datadbs1 with log;
create table t1 (c1 int,c2 varchar(10));
insert into t1 values(1,'aaa');
insert into t1 values(2,'bbb');
select * from t1 where c1 =1;
当发起查询请求时,数据库是如何定位数据在存储上的物理位置呢
大概流程如下
1 获取 datadbs1表空间物理位置
slot5 中记录了逻辑位置与物理位置
整理如下
逻辑位置 物理位置
0 6:24
50 6:2120
100 6:5752
200 6:11448
400 6:2303864
2 获取t1表的partnum
select hex(partnum) from systables where tabname='t1';
其中0x6标识表空间chunk编号 0x1f6表示逻辑偏移
转换成10 进制为502
t1表实际物理位置为 (502-400)* pagesize /2 +2303864=2304680
oncheck -pP 6 2304680
其中 slot5记录了 t1表的extent 信息,数据也存储在extent 中
前四字节为逻辑偏移 ,之后两字节为表空间编号 ,然后再四字节为物理位置
上图描述为t1表目前只有一个 extent 逻辑上从0 开始 表空间chunk编号为 6 对应实际物理位置为 0x268d80 转换为10 进制为 2526592
oncheck -pP 6 2526592
FREE 为 bitmap 页,下一页即为数据实际存储位置
gbase8s使用rowid /ifx_row_id 来标识数据存储
257,258 转换为16进制为0x101 ,0x102
rowid是一个4字节编码,前3个字节是逻辑页号,第4个字节是slot号,rowid为257,转16进制为0x101,那么逻辑页号就是0x000001,slot号就是0x01,rowid为258,转16进制为0x102,那么逻辑页号就是0x000001,slot号就是0x02,所以rowid为0x101,0x102对应的物理页号就是 2526592 + 8=2526600
导出对应的page
dd if=/home/gbasedbt/install_dir/350_3x2_4/gbase350_3x2_4_dbs/datadbs1_1 of=a.page skip=315825 count=1 bs=16k
od -x a.page