虚谷数据库的行标识’rowpos’详解

2023年 10月 31日 93.7k 0

oracle的rowid想必都熟悉,虚谷数据库也有自己的rowpos来作为行标识。本文将介绍虚谷数据库的存储格式,以及如何通过rowpos定位指定数据的存储位置信息。这里要先说明虚谷数据库的存储格式,数据块大小默认8k,按照8M大小一个的gstore分给数据库对象,比如建一张空表,就会分给其一个8M的gstore,当此表用完了8M时,再分配新的gstore,以此递推。所以一个8M的gstore里包括1024个8K大小的块。

1.首先,从表里查一条数据的rowpos。

可以看到rowpos是一串很长的数字,其实它是由二进制转成的十进制数字。将其转换成二进制如下

11101001 00000001 00010010 00000000 10001001

一个字节表示8位,低2字节表示的是一个块里的第多少行,00000000 10001001转换成十进制就是137,这里行是逻辑概念,如果这个块总共存储了150行数据的话,这就是150行里的第137行;中2字节位表示的是块号,00000001 00010010转换成十进制就是274,即第274块;高4字节表示的是gsto_no号,11101001转换成十进制为233。所以知道以上信息后,可以通过rowpos,计算出某行数据的存储位置信息。

2.查看某条数据的存储位置信息。

SELECT ( rowpos /65535/65535) :: int AS gsto_no, ( mod ( rowpos, power(2,26) ) / 65535 ) :: int AS blk_no, MOD(rowpos ,65536)AS row_no FROM dbo.blkt WHERE id=23333;

—函数说明:mod(a,b)函数:对a除以b后取余,power(a,b)函数:取a的b次方。

这里使用"rowpos/65535/65535"取高4字节的数值;用"(mod(rowpos,power(2,26))/65535)"取中二字节的数值,先用mod取余,得到低四字节的二进制数00000001 00010010 00000000 10001001,再除以低2字节的大小’65535’,得到中2字节的数值00000001 00010010,最后低2字节的数就可以直接用rowpos取低2字节大小的余得到,即MOD(rowpos,65536)。所以可以直接查询出id=23333的这一行存储在gstore233的第274个块的第137行上。

3.由上描述信息,我们也可以反推,查询一个gstore的某一块上有哪些数据,sql过程不再缀述,原理和上面一样。先查询表blkt有哪些gstore。

查出blkt有233-239的7个gstore。下面是查询块上数据的sql。

SELECT * FROM dbo.blkt WHERE rowpos BETWEEN (power(2,32)*gsto_no+power(2,16)*blk_no)  AND (power(2,32)*gsto_no+power(2,16)*(blk_no+1)) ORDER BY rowpos ;

将gsto_no,blk_no,替换成你想查询的gstore和块,这里查询gstore233的第一个块有哪些数据。

共查出146行数据,由于计算问题,最后一行其实是下一个块的第一行,所以实际上前145行是我们要找的数据。

相关文章

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

发布评论