注册
DM8伪列学习
专栏/技术分享/ 文章详情 /

DM8伪列学习

DMBL110 2022/07/31 1961 3 0
摘要

DM8伪列学习

1 伪列描述
目前DM8中存在的伪列如下:
 rownum
ROWNUM 是一个虚假的列,表示从表中查询的行号,或者连接查询的结果集行数。使用 ROWNUM 可以限制查询返回的行数。rownum值的分配在查询谓词解析之后,任何排序和聚合之前,即:先查询指定行后,再进行排序等聚合操作
 rowid
用来标识数据库基表中每一条记录的唯一键值,标识了数据记录的确切的存储位置。从1开始递增。注意,rowid会物理存储在数据文件中的,后面有测试说明。
 user\uid
用来表示当前用户的用户名和用户标识。
 trxid
用来表示当前事务的事务标识。
 sessid
表示当前会话的 ID 标识。
 PHYROWID
用来表示当前记录的物理存储信息。
当查询语句中实际使用CSCN、CSEK、BLKUP操作符时,PHYROWID内容是聚集B树中记录的物理存储地址;
当查询语句中实际仅使用SSEK、SSCN操作符时,PHYROWID内容是二级B树中记录的物理存储地址。

本次主要通过测试学习伪列ROWID,PHYROWID。

2 ROWID
DM8默认采用索引组织表的方式存储数据。指定主键时,是否默认指定为cluster,由参数PK_WITH_CLUSTER控制。
下面测试二级索引中,存储了rowid还是主键值及事务号?
2.1参数PK_WITH_CLUSTER为0
•测试过程如下
image.png

•查看索引所在二进制文件
hexdump /home/dmdba/dmdbms/dmdb/tbs01.dbf
image.png

总结:
通过执行计划可以看出,通过二级索引扫描获取其他列时,需要回表,而查询rowid时,没有回表,因此可以确定二级索引中没有存储主键值,而是存储了rowid。
通过查看二进制文件也可以确认,二级索引中没有存储主键值,而是rowid,标记处为rowid的值。
另外:椭圆标记处记录事务号,这样索引的可见性,直接可以通过索引判断,而目前mysql、postgresql的索引行中都没有记录事务号。
2.2参数PK_WITH_CLUSTER为1
•测试过程如下
image.png
•查看索引所在二进制文件
hexdump /home/dmdba/dmdbms/dmdb/tbs01.dbf
image.png
总结:
通过执行计划可以看出,通过二级索引扫描获取主键列时,无需回表,查询rowid时,也没有回表,因此可以确定二级索引中即存储了主键值,又存储了rowid。
通过查看二进制文件也可以确认,二级索引中即存储了主键值,又存储了rowid,标记处为rowid、主键值。
3 PHYROWID
PHYROWID 值由聚集 B 树或二级 B 树中物理记录的文件号、页号、页内槽号组成,能体现聚集 B 树或二级 B 树的存储信息,聚集 B 树记录的最高位为 1。
image.png
phyrowid为bigint类型64位,二进制转换后:
4611686039480696833:
100000000000000000000000000010011100110111000000000000000000001
4611686039480696834:
100000000000000000000000000010011100110111000000000000000000010

image.png
其中:
•段头页321248二进制位:1001110011011100000,对应phyrowid中间部分
•phyrowid二进制尾部部分为行槽号
•phyrowid二进制的前面部分,B树最高位1,其余0,说明是0号文件

通过phyrowid查询数据:
image.png
可以看出通过phyrowid也可以直接查询数据。

达梦技术社区:https://eco.dameng.com
24小时免费服务热线:400 991 6599

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服