kingbaseES的隐藏列
kingbaseES的事务处理机制不同于MySQL,MySQL的事务处理机制过程中,会把旧数据放在UNDO数据段,如果发生意外事故,会从UNDO段里面把数据进行重放回滚。
而kingbaseES在事务中处理,对于update、insert的操作会新写形成多个版本数据,如果发生意外,从多版本里重放。这样的好处是时间响应速度快,坏处是update和insert的操作会占用大量的空间,kingbaseES是通过空间换取了性能,随之而来有一些隐藏列的概念;
#我们创建一个简单表
xiao=# create table tb1(id int);
CREATE TABLE
#普通查询
xiao=# select * from tb1;
id
----
(0 rows)
xiao=# insert into tb1 values(1);
INSERT 0 1
# 加上对系统列的查询
xiao=# select tableoid,ctid,xmin,xmax,cmin,cmax,* from tb1;
tableoid | ctid | xmin | xmax | cmin | cmax | id
----------+-------+------+------+------+------+----
16513 | (0,1) | 1189 | 0 | 0 | 0 | 1
(1 row)
tableoid,ctid,xmin,xmax,cmin,cmax 就是隐藏系统列,从它们身上我们可以知道什么
- tableoid 字段代表了数据所在表的对象 id(OID),也就是数据字典表 pg_class 中与该表信息相关的数据行。
- ctid 标记行的物理位置,格式为 (m,n) 其中 m表示块号,n表示在块内的行号,代表了数据行在表中的物理位置,也就是行标识(tuple identifier),由一对数值组成(块编号和行索引)。ctid 类似于 Oracle 中的伪列 ROWID,
- xmin:在创建记录(tuple)时,记录此时的事务id,后面每次update也会更新。
- xmax: 在更新或删除tuple或者lock时,记录此时的事务id;如果记录没有被删除,那么此时为0。
- cmin:插入该元组的命令在插入事务中的命令标识(从0开始累加)
- cmax:删除该元组的命令在插入事务中的命令标识(从0开始累加)
tableoid
xiao=# insert into tb1 select sry from generate_series(1,10000000) as sry;
INSERT 0 10000000
xiao=# select tableoid,ctid,xmin,xmax,cmin,cmax,* from tb1 limit 1;
tableoid | ctid | xmin | xmax | cmin | cmax | id
----------+----------+------+------+------+------+--------
16513 | (5504,1) | 1193 | 0 | 0 | 0 | 143904
(1 row)
#上面我们得知tb1的 tableoid是16513,根据16513可以找到表对应的物理路径
[root@server128 ~]# cd /home/kinges/data/base/
[root@server128 base]# ll
total 92
drwx------ 2 kinges kinges 12288 May 25 11:15 1
drwx------ 2 kinges kinges 12288 May 25 11:15 14385
drwx------ 2 kinges kinges 16384 May 29 09:03 14386
drwx------ 2 kinges kinges 12288 May 25 11:15 14387
drwx------ 2 kinges kinges 12288 May 25 11:16 14388
drwx------ 2 kinges kinges 12288 May 29 11:32 16502
drwx------ 2 kinges kinges 12288 May 29 15:58 16512
drwx------ 2 kinges kinges 4096 May 29 15:59 syssql_tmp
#这里找到的16513,就是表存储的硬盘文件,如果数据大子,会展开多个保存
[root@server128 base]# find . -name "*16513*"
./16512/16513
./16512/16513_fsm
[root@server128 base]# du -sm ./16512/16513*
384 ./16512/16513
1 ./16512/16513_fsm
ctid
#维护命令,查看tb1表有多少个页面,
xiao=# SELECT relname, reltuples, relpages FROM pg_class WHERE relname='tb1';
-[ RECORD 1 ]------------
relname | tb1
reltuples | 1.1099864e+07
relpages | 49116
#select txid_current();
#pg_stats是由pg_statistic系统表扩展而来的系统视图,记录的是每个表每个字段的统计信息
xiao=# SELECT * FROM pg_stats WHERE tablename='tb1';
-[ RECORD 1 ]-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
schemaname | public
tablename | tb1
attname | id
inherited | f
null_frac | 0
avg_width | 4
n_distinct | -0.8353403
most_common_vals |
most_common_freqs |
histogram_bounds | {22,37977,75289,112734,166647,216408,274401,327638,381927,440237,494522,553427,609528,667231,728393,785396,845249,900902,955173,1020554,1118276,1225681,1346000,1457596,1565726,1681748,1811195,1922017,2032474,2148774,2271132,2374368,2489418,2607705,2723889,2849565,2964402,3074564,3186238,3288648,3387490,3489660,3603291,3724102,3819819,3930561,4033159,4144561,4262942,4371972,4480391,4578557,4690280,4796119,4904613,5006043,5114775,5224816,5339203,5450110,5562979,5673354,5780598,5890095,6002060,6095538,6215702,6322185,6440839,6549410,6662557,6781594,6887171,6982386,7094983,7207728,7321382,7443914,7553132,7671869,7802215,7927170,8029788,8140414,8252561,8359317,8468888,8574849,8692315,8811756,8927063,9034515,9137174,9240819,9326881,9436943,9542658,9650634,9765168,9882981,9999536}
correlation | 0.9969708
most_common_elems |
most_common_elem_freqs |
elem_count_histogram |
hybrid_histogram_bounds |
hybrid_histogram_freqs |
hybrid_histogram_bounds_freqs |
# 对表的指定的字段进行页采样
xiao=# ALTER TABLE tb1 ALTER COLUMN id SET STATISTICS 1000;
ALTER TABLE
#ctid是一个有力监控维护的系统列, 可以所属元组属于哪一个页面
xiao=# select tableoid,ctid,xmin,xmax,cmin,cmax,* from tb1 where id=10000000;
-[ RECORD 1 ]--------
tableoid | 16513
ctid | (49115,11)
xmin | 1193
xmax | 0
cmin | 0
cmax | 0
id | 10000000
xmin与xmax
xmin记录的是事务ID,xmax记录的也是事务ID,不同的是xmin记录的是已经运行结束的事务ID,而xmax记录的则是运行中的事务ID,所有持久化的数据都会有xmin,
下面xmin有事务ID1123,1125,1126, 表明曾经运行3个事务SQL,运行后生成对应的值为1,3,-2

下图xmin有事务ID1123,1125,1126, 注意1123对应的xmax为0,0表明当前没有事务在运行。 而1125和1126对应的xmax为1127, 表明当前1127事务ID正在执行过程中,将会影响1125和1126。

如果1127的事务顺利提交后,xmin将会替换1127的值,xmax变成0

全过程如下

cmin和cmax
cmin主要是插入记录数的标识, cmax主要是删除记录数的标识,大部分情况cmin的记录数与cmax保持。下图运行1200的事务ID,对相关记录进行修改操,cmin和cmax记录操作次数。

从隐藏系统列可以知道什么
- kingbaseES与PG一样,都是通过对象标识符OID对所有的数据库对象包括 数据库、表、schema、字段进行管理,tableoid可以快速返回相关表名唯一的OID,给矛管理上的方便。
- ctid是包括所有的记录的唯一物理标识,即使数据重复一模一样,ctid肯定是不同的,从ctid我们可以知道 每一个记录,做出准确的业务判断。
- 从xmin和xmax身上,我们知道当前数据是由哪些事务ID操作生成,进而一步推测事务ID全貌是什么样的SQL, 另外知道当前记录数据正在被什么样的事务处理过程中。
- 从cmin和cmax身上,可以知道当前事务相关的操作【update\insert】,知道事务涉及到 多少个写操作,从而评估复杂性程度。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




