概述
oceanbase数据库中的每一行都有一个地址。Rowid 数据类型用于存储数据库中的行地址,本文主要对 Rowid数据类型进行相关介绍并解析rowid构成。
ROWID 数据类型
OceanBase 数据库当前版本所支持的 ROWID 为逻辑 ROWID。索引组织表(IOT)的 ROWID 就是逻辑 ROWID。
您可以通过查询伪列 ROWID 来检查 ROWID 行地址。该伪列的值为表示每行地址的字符串,这些字符串的数据类型为 ROWID。您还可以创建包含具有 ROWID 数据类型列的表。
ROWID 通过 Base64 编码转换而成。
ROWID 不能直接使用,有关详细的使用说明,请参见 ROWID 伪列。
UROWID 数据类型
Rowid 的另一种类型叫 Universal Rowed(UROWID)。UROWID 支持逻辑 ROWID。
某些表的行具有非物理或永久地址,或者不是由 OceanBase 数据库生成的地址。例如,索引组织表的行地址存储在索引叶中,是可以移动的。
OceanBase 数据库使用通用 ROWID (UROWID) 来存储索引组织表的地址。索引组织表具有逻辑 UROWID,UROWID 存储在 ROWID 伪列中。
OceanBase 数据库根据表的主键创建逻辑 ROWID。只要主键不变,逻辑 ROWID 就不会改变。索引组织表的 ROWID 伪列的数据类型为 UROWID。您可以使用 SELECT ... ROWID 语句访问此伪列。如果要存储索引组织表的 ROWID,则可以为该表定义一个 UROWID 类型的列,并将 ROWID 伪列的值检索到该列中。
ROWID 伪列
ROWID 伪列提供了快速定位表中某一行的能力,ROWID 值由主键编码得到,不会进行实际的存储。本文主要介绍 ROWID 伪列的 ROWID 值的使用说明。
对于数据库中的每一行,ROWID 伪列返回经过编码后的主键,通过 Base64 编码转换而成。
通常,ROWID 值唯一标识数据库中的一行。但是,存储在同一集群中的不同表中的行可以具有相同的 ROWID。ROWID 伪列所支持的数据类型是 UROWID。
ROWID 值有如下重要用途:
- 是访问单行的最快方式。
- 作为表中行的唯一标识符。
使用 ROWID 值需要特别注意以下事项:
- 不能使用 ROWID 作为表的主键。
- 虽然可以在查询的
SELECT和WHERE子句中使用 ROWID 伪列,但是因为这些伪列值实际上并未存储在数据库中,所以不能插入、更新或删除 ROWID 值。
ROWID 值的使用示例如下:
-
从
employees表中查询 ROWID 值 。obclient> SELECT ROWID, last_name FROM employees WHERE department_id = 20; +-------------------+-----------+ | ROWID | LAST_NAME | +-------------------+-----------+ | *AAIKAQAAAAAAAAA= | xxx | +-------------------+-----------+ 1 row in set -
使用 ROWID 值进行
UPDATE操作。obclient> UPDATE employees SET last_name = 'yyy' WHERE ROWID = '*AAIKAQAAAAAAAAA='; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0 obclient> SELECT last_name, department_id FROM employees; +-----------+---------------+ | LAST_NAME | DEPARTMENT_ID | +-----------+---------------+ | yyy | 20 | +-----------+---------------+ 1 row in set
ROWID的构成与解析示例
V3
- 无主键表version+(列类型,列值)*rowkey数量,rowkey包含一列自增隐藏列
示例1 单表(version+__pk_increment)
obclient [SYS]> create table test.rtest1(id number,c varchar(100));
Query OK, 0 rows affected (0.087 sec)
insert into test.rtest1 select rownum,'test'||rownum from dual connect by rownum<100;
obclient [SYS]> insert into test.rtest1 select rownum,'test'||rownum from dual connect by rownum<100;
Query OK, 99 rows affected (0.030 sec)
Records: 99 Duplicates: 0 Warnings: 0
obclient [SYS]> commit;
Query OK, 0 rows affected (0.003 sec)
update test.rtest1 set c=c where id<=10;
select distinct a.svr_ip,a.id,a.user,a.tenant,a.state,a.time,a.info,rowkey from __all_virtual_processlist a,__ALL_VIRTUAL_TRANS_LOCK_STAT b,__all_virtual_table c where
a.svr_ip=b.svr_ip and a.id=b.session_id and b.table_id=c.table_id and b.tenant_id=c.tenant_id and c.table_name='RTEST1';
+---------------+------------+------+--------+-------+-----------+------+-------------------------------------------------------------------+
| svr_ip | id | user | tenant | state | time | info | rowkey |
+---------------+------------+------+--------+-------+-----------+------+-------------------------------------------------------------------+
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 37.307805 | NULL | table_id=1100611139453972 rowkey_object=[{"BIGINT UNSIGNED":10}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 37.307805 | NULL | table_id=1100611139453972 rowkey_object=[{"BIGINT UNSIGNED":9}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 37.307805 | NULL | table_id=1100611139453972 rowkey_object=[{"BIGINT UNSIGNED":8}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 37.307805 | NULL | table_id=1100611139453972 rowkey_object=[{"BIGINT UNSIGNED":7}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 37.307805 | NULL | table_id=1100611139453972 rowkey_object=[{"BIGINT UNSIGNED":6}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 37.307805 | NULL | table_id=1100611139453972 rowkey_object=[{"BIGINT UNSIGNED":5}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 37.307805 | NULL | table_id=1100611139453972 rowkey_object=[{"BIGINT UNSIGNED":4}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 37.307805 | NULL | table_id=1100611139453972 rowkey_object=[{"BIGINT UNSIGNED":3}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 37.307805 | NULL | table_id=1100611139453972 rowkey_object=[{"BIGINT UNSIGNED":2}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 37.307805 | NULL | table_id=1100611139453972 rowkey_object=[{"BIGINT UNSIGNED":1}] |
+---------------+------------+------+--------+-------+-----------+------+-------------------------------------------------------------------+
10 rows in set (0.081 sec)
rowkey table_id=1100611139453972 rowkey_object=[{"BIGINT UNSIGNED":10}]
查询rowkey构成
select column_id,column_name,rowkey_position,index_position,order_in_rowkey,is_hidden,data_type,data_length from __all_virtual_column where table_id=1100611139453972;
+-----------+----------------+-----------------+----------------+-----------------+-----------+-----------+-------------+
| column_id | column_name | rowkey_position | index_position | order_in_rowkey | is_hidden | data_type | data_length |
+-----------+----------------+-----------------+----------------+-----------------+-----------+-----------+-------------+
| 1 | __pk_increment | 1 | 0 | 0 | 1 | 10 | 0 |
| 16 | ID | 0 | 0 | 0 | 0 | 15 | 0 |
| 17 | C | 0 | 0 | 0 | 0 | 22 | 100 |
+-----------+----------------+-----------------+----------------+-----------------+-----------+-----------+-------------+
3 rows in set (0.030 sec)
构造ROWID,并通过ROWID查询
version b'\x00\x02'
__pk_increment data_type data_value
rowkey_object=[{"BIGINT UNSIGNED":10}]
binascii.b2a_base64(b'\x00\x02\n'+struct.pack('Q',10))
In [113]: binascii.b2a_base64(b'\x00\x02'+b'\x0a'+struct.pack('Q',10))
Out[113]: b'AAIKCgAAAAAAAAA=\n'
select * from test.rtest1 where rowid='*AAIKCgAAAAAAAAA=';
obclient [SYS]> select * from test.rtest1 where rowid='*AAIKCgAAAAAAAAA=';
+------+--------+
| ID | C |
+------+--------+
| 10 | test10 |
+------+--------+
1 row in set (0.001 sec)
示例2 分区表(version+分区键+__pk_increment)
create table test.rtest_part(id number,c varchar(100))
partition by range(id)
(
partition p1 values less than(100),
partition p2 values less than(200)
);
insert into test.rtest_part select rownum,'test'||rownum from dual connect by rownum<200;
update test.rtest_part set c=c where id<=10;
select distinct a.svr_ip,a.id,a.user,a.tenant,a.state,a.time,a.info,rowkey from __all_virtual_processlist a,__ALL_VIRTUAL_TRANS_LOCK_STAT b,__all_virtual_table c where
a.svr_ip=b.svr_ip and a.id=b.session_id and b.table_id=c.table_id and b.tenant_id=c.tenant_id and c.table_name='RTEST_PART';
MySQL [oceanbase]> select distinct a.svr_ip,a.id,a.user,a.tenant,a.state,a.time,a.info,rowkey from __all_virtual_processlist a,__ALL_VIRTUAL_TRANS_LOCK_STAT b,__all_virtual_table c where
-> a.svr_ip=b.svr_ip and a.id=b.session_id and b.table_id=c.table_id and b.tenant_id=c.tenant_id and c.table_name='RTEST_PART';
+---------------+------------+------+--------+-------+-----------+------+------------------------------------------------------------------------------------+
| svr_ip | id | user | tenant | state | time | info | rowkey |
+---------------+------------+------+--------+-------+-----------+------+------------------------------------------------------------------------------------+
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 22.812976 | NULL | table_id=1100611139453974 rowkey_object=[{"DECIMAL":"10"},{"BIGINT UNSIGNED":10}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 22.812976 | NULL | table_id=1100611139453974 rowkey_object=[{"DECIMAL":"9"},{"BIGINT UNSIGNED":9}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 22.812976 | NULL | table_id=1100611139453974 rowkey_object=[{"DECIMAL":"8"},{"BIGINT UNSIGNED":8}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 22.812976 | NULL | table_id=1100611139453974 rowkey_object=[{"DECIMAL":"7"},{"BIGINT UNSIGNED":7}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 22.812976 | NULL | table_id=1100611139453974 rowkey_object=[{"DECIMAL":"6"},{"BIGINT UNSIGNED":6}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 22.812976 | NULL | table_id=1100611139453974 rowkey_object=[{"DECIMAL":"5"},{"BIGINT UNSIGNED":5}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 22.812976 | NULL | table_id=1100611139453974 rowkey_object=[{"DECIMAL":"4"},{"BIGINT UNSIGNED":4}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 22.812976 | NULL | table_id=1100611139453974 rowkey_object=[{"DECIMAL":"3"},{"BIGINT UNSIGNED":3}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 22.812976 | NULL | table_id=1100611139453974 rowkey_object=[{"DECIMAL":"2"},{"BIGINT UNSIGNED":2}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 22.812976 | NULL | table_id=1100611139453974 rowkey_object=[{"DECIMAL":"1"},{"BIGINT UNSIGNED":1}] |
+---------------+------------+------+--------+-------+-----------+------+------------------------------------------------------------------------------------+
10 rows in set (0.071 sec)
select rowid,t.* from test.rtest_part t where id<=10;
obclient [SYS]> select rowid,t.* from test.rtest_part t where id<=10;
+-------------------------------+------+--------+
| ROWID | ID | C |
+-------------------------------+------+--------+
| *AAIPAQEAwAEAAAAKAQAAAAAAAAA= | 1 | test1 |
| *AAIPAQEAwAIAAAAKAgAAAAAAAAA= | 2 | test2 |
| *AAIPAQEAwAMAAAAKAwAAAAAAAAA= | 3 | test3 |
| *AAIPAQEAwAQAAAAKBAAAAAAAAAA= | 4 | test4 |
| *AAIPAQEAwAUAAAAKBQAAAAAAAAA= | 5 | test5 |
| *AAIPAQEAwAYAAAAKBgAAAAAAAAA= | 6 | test6 |
| *AAIPAQEAwAcAAAAKBwAAAAAAAAA= | 7 | test7 |
| *AAIPAQEAwAgAAAAKCAAAAAAAAAA= | 8 | test8 |
| *AAIPAQEAwAkAAAAKCQAAAAAAAAA= | 9 | test9 |
| *AAIPAQEAwAoAAAAKCgAAAAAAAAA= | 10 | test10 |<<<
+-------------------------------+------+--------+
10 rows in set (0.006 sec)
table_id=1100611139453974 rowkey_object=[{"DECIMAL":"10"},{"BIGINT UNSIGNED":10}]
MySQL [oceanbase]> select column_id,column_name,rowkey_position,index_position,order_in_rowkey,is_hidden,data_type,data_length from __all_virtual_column where table_id=1100611139453974 order by rowkey_position;
+-----------+----------------+-----------------+----------------+-----------------+-----------+-----------+-------------+
| column_id | column_name | rowkey_position | index_position | order_in_rowkey | is_hidden | data_type | data_length |
+-----------+----------------+-----------------+----------------+-----------------+-----------+-----------+-------------+
| 17 | C | 0 | 0 | 0 | 0 | 22 | 100 |
| 16 | ID | 1 | 0 | 0 | 0 | 15 | 0 |
| 1 | __pk_increment | 2 | 0 | 0 | 1 | 10 | 0 |
+-----------+----------------+-----------------+----------------+-----------------+-----------+-----------+-------------+
3 rows in set (5.270 sec)
table_id=1100611139453974 rowkey_object=[{"DECIMAL":"10"},{"BIGINT UNSIGNED":10}]
{"DECIMAL":"10"}
obclient [SYS]> select dump(cast(10 as DECIMAL),16) from dual;
+--------------------------------+
| DUMP(CAST(10ASDECIMAL),16) |
+--------------------------------+
| Typ=15 Len=8: 1,1,0,c0,a,0,0,0 |<<<\x01\x01\x00\xc0\n\x00\x00\x00
+--------------------------------+
1 row in set (0.003 sec)
{"BIGINT UNSIGNED":10}
In [120]: struct.pack('Q',10)
Out[120]: b'\n\x00\x00\x00\x00\x00\x00\x00'
version \x00\x02
data_type \x0f data_type 15
data_value \x01\x01\x00\xc0\n\x00\x00\x00
data_type \n data_type 10
data_value \n\x00\x00\x00\x00\x00\x00\x00
binascii.b2a_base64(b'\x00\x02'+b'\x0f'+b'\x01\x01\x00\xc0\n\x00\x00\x00'+b'\n'+b'\n\x00\x00\x00\x00\x00\x00\x00',newline=False)
In [16]: binascii.b2a_base64(b'\x00\x02'+b'\x0f'+b'\x01\x01\x00\xc0\n\x00\x00\x00'+b'\n'+b'\n\x00\x00\x00\x00\x00\x00\x
...: 00',newline=False)
Out[16]: b'AAIPAQEAwAoAAAAKCgAAAAAAAAA='
select rowid,t.* from test.rtest_part t where rowid='*AAIPAQEAwAoAAAAKCgAAAAAAAAA=';
obclient [SYS]> select rowid,t.* from test.rtest_part t where rowid='*AAIPAQEAwAoAAAAKCgAAAAAAAAA=';
+-------------------------------+------+--------+
| ROWID | ID | C |
+-------------------------------+------+--------+
| *AAIPAQEAwAoAAAAKCgAAAAAAAAA= | 10 | test10 |
+-------------------------------+------+--------+
1 row in set (0.002 sec)
obclient [SYS]>
- 有主键表由version+(列类型,列值)*rowkey数量
obclient [SYS]> create table test.rtest2(id number,c varchar(100),c2 varchar(100),primary key(id,c));
Query OK, 0 rows affected (0.087 sec)
insert into test.rtest2 select rownum,'test'||rownum,'test'||rownum from dual connect by rownum<100;
obclient [SYS]> insert into test.rtest2 select rownum,'test'||rownum,'test'||rownum from dual connect by rownum<100;
Query OK, 99 rows affected (0.010 sec)
Records: 99 Duplicates: 0 Warnings: 0
obclient [SYS]> commit;
Query OK, 0 rows affected (0.002 sec)
update test.rtest2 set c=c where id<=10;
MySQL [oceanbase]> select distinct a.svr_ip,a.id,a.user,a.tenant,a.state,a.time,a.info,rowkey from __all_virtual_processlist a,__ALL_VIRTUAL_TRANS_LOCK_STAT b,__all_virtual_table c where a.svr_ip=b.svr_ip and a.id=b.session_id and b.table_id=c.table_id and b.tenant_id=c.tenant_id and c.table_name='RTEST2';
+---------------+------------+------+--------+-------+----------+------+-----------------------------------------------------------------------------------------------------------+
| svr_ip | id | user | tenant | state | time | info | rowkey |
+---------------+------------+------+--------+-------+----------+------+-----------------------------------------------------------------------------------------------------------+
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 5.403958 | NULL | table_id=1100611139453973 rowkey_object=[{"DECIMAL":"10"},{"VARCHAR":"test10", collation:"utf8mb4_bin"}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 5.403958 | NULL | table_id=1100611139453973 rowkey_object=[{"DECIMAL":"9"},{"VARCHAR":"test9", collation:"utf8mb4_bin"}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 5.403958 | NULL | table_id=1100611139453973 rowkey_object=[{"DECIMAL":"8"},{"VARCHAR":"test8", collation:"utf8mb4_bin"}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 5.403958 | NULL | table_id=1100611139453973 rowkey_object=[{"DECIMAL":"7"},{"VARCHAR":"test7", collation:"utf8mb4_bin"}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 5.403958 | NULL | table_id=1100611139453973 rowkey_object=[{"DECIMAL":"6"},{"VARCHAR":"test6", collation:"utf8mb4_bin"}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 5.403958 | NULL | table_id=1100611139453973 rowkey_object=[{"DECIMAL":"5"},{"VARCHAR":"test5", collation:"utf8mb4_bin"}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 5.403958 | NULL | table_id=1100611139453973 rowkey_object=[{"DECIMAL":"4"},{"VARCHAR":"test4", collation:"utf8mb4_bin"}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 5.403958 | NULL | table_id=1100611139453973 rowkey_object=[{"DECIMAL":"3"},{"VARCHAR":"test3", collation:"utf8mb4_bin"}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 5.403958 | NULL | table_id=1100611139453973 rowkey_object=[{"DECIMAL":"2"},{"VARCHAR":"test2", collation:"utf8mb4_bin"}] |
| 192.168.56.36 | 3221718478 | SYS | test | SLEEP | 5.403958 | NULL | table_id=1100611139453973 rowkey_object=[{"DECIMAL":"1"},{"VARCHAR":"test1", collation:"utf8mb4_bin"}] |
+---------------+------------+------+--------+-------+----------+------+-----------------------------------------------------------------------------------------------------------+
10 rows in set (0.072 sec)
select rowid,t.* from test.rtest2 t where id<=10;
obclient [SYS]> select rowid,t.* from test.rtest2 t where id<=10;
+-----------------------------------+----+--------+--------+
| ROWID | ID | C | C2 |
+-----------------------------------+----+--------+--------+
| *AAEPAQEAwAEAAAAWLgUAAAB0ZXN0MQ== | 1 | test1 | test1 |
| *AAEPAQEAwAIAAAAWLgUAAAB0ZXN0Mg== | 2 | test2 | test2 |
| *AAEPAQEAwAMAAAAWLgUAAAB0ZXN0Mw== | 3 | test3 | test3 |
| *AAEPAQEAwAQAAAAWLgUAAAB0ZXN0NA== | 4 | test4 | test4 |
| *AAEPAQEAwAUAAAAWLgUAAAB0ZXN0NQ== | 5 | test5 | test5 |
| *AAEPAQEAwAYAAAAWLgUAAAB0ZXN0Ng== | 6 | test6 | test6 |
| *AAEPAQEAwAcAAAAWLgUAAAB0ZXN0Nw== | 7 | test7 | test7 |
| *AAEPAQEAwAgAAAAWLgUAAAB0ZXN0OA== | 8 | test8 | test8 |
| *AAEPAQEAwAkAAAAWLgUAAAB0ZXN0OQ== | 9 | test9 | test9 |
| *AAEPAQEAwAoAAAAWLgYAAAB0ZXN0MTA= | 10 | test10 | test10 |<<<
+-----------------------------------+----+--------+--------+
10 rows in set (0.006 sec)
binascii.a2b_base64('AAEPAQEAwAoAAAAWLgYAAAB0ZXN0MTA==')
select column_id,column_name,rowkey_position,index_position,order_in_rowkey,is_hidden from __all_virtual_column where table_id=1100611139453973;
select column_id,column_name,rowkey_position,index_position,order_in_rowkey,is_hidden,data_type,data_length from __all_virtual_column where table_id=1100611139453973;
+-----------+-------------+-----------------+----------------+-----------------+-----------+-----------+-------------+
| column_id | column_name | rowkey_position | index_position | order_in_rowkey | is_hidden | data_type | data_length |
+-----------+-------------+-----------------+----------------+-----------------+-----------+-----------+-------------+
| 16 | ID | 1 | 0 | 0 | 0 | 15 | 0 |
| 17 | C | 2 | 0 | 0 | 0 | 22 | 100 |
| 18 | C2 | 0 | 0 | 0 | 0 | 22 | 100 |
+-----------+-------------+-----------------+----------------+-----------------+-----------+-----------+-------------+
3 rows in set (0.030 sec)
binascii.a2b_base64('AAEPAQEAwAoAAAAWLgYAAAB0ZXN0MTA==')
In [122]: binascii.a2b_base64('AAEPAQEAwAoAAAAWLgYAAAB0ZXN0MTA==')
...:
Out[122]: b'\x00\x01\x0f\x01\x01\x00\xc0\n\x00\x00\x00\x16.\x06\x00\x00\x00test10'
rowkey_object=[{"DECIMAL":"10"},{"VARCHAR":"test10", collation:"utf8mb4_bin"}]
version b'\x00\x01
datatype \x0f
ID \x01\x01\x00\xc0\n\x00\x00\x00
datatype \x16
C .\x06\x00\x00\x00test10'
obclient [SYS]> select dump(cast(10 as DECIMAL),16) from dual;
+--------------------------------+
| DUMP(CAST(10ASDECIMAL),16) |
+--------------------------------+
| Typ=15 Len=8: 1,1,0,c0,a,0,0,0 |
+--------------------------------+
1 row in set (0.003 sec)
V4
-
有主键表的 ROWID 由每行数据的主键列和分区键中的虚拟生成列组成,再通过 Base64 编码转换而成。
ROWID 伪列的值是每行数据的 Key(对于有主键表是 Primary Key,对于无主键表是系统自动生成的序列),通过 Base64 编码转换而成。可以通过使用保留字 ROWID 作为列名的 SQL 来访问每一行的 Rowid。
-
无主键表的 ROWID 由 tablet id 和隐藏主键列组成,再通过 Base64 编码转换而成。其中 tablet id 和隐藏主键列均能用 64 位整型来表示,因此无主键表的 ROWID 长度是固定的。
/*
* logical rowid (pk rowid and no pk rowid)
* +-----------+---------+---------+--------------+
* | 1 byte | dba len | 1 byte | pk_len bytes |
* +-----------+---------+---------+--------------+
* | dba len | dba | version | pk_content |
* +-----------+---------+---------+--------------+
*
* heap-organized table rowid
* +--------------+-----------+----------------+
* | 3 bit | 37 bit | 40 bit |
* +--------------+-----------+----------------+
* | version >> 5 | tablet_id | auto_increment |
* +--------------+-----------+----------------+
*
* extended heap-organized table rowid
* +--------------+-----------+----------------+
* | 3 bit | 61 bit | 64 bit |
* +--------------+-----------+----------------+
* | version >> 5 | tablet_id | auto_increment |
* +--------------+-----------+----------------+
*/
const uint8_t *rowid_content_;




