暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从kingbaseES的隐藏系统列我们可以知道什么

原创 肖小可爱乐乐 2024-05-29
273

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

image.png

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

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

image.png

全过程如下
image.png

cmin和cmax

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

image.png

从隐藏系统列可以知道什么

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

评论