GBase 8a
其他
文章

GBase 8a 增删改原理介绍

发表于2025-09-27 21:25:39106次浏览4个评论

1、Insert:

Insert包括两种方式,分别为insert into …… value …… 和 insert into ……  Select …… 。

Insert into value方式:
1)GNode层在获取该执行sql后,获得其已经解析好的数据流,并进行字段提取和必要的转换、合法性检查。
2)之后将数据插入到缓存(insert_buffer)。
3)在commit阶段将数据统一写入磁盘。
   以该方式进行数据入库时,建议批量进行,即在对多行记录执行插入后,统一进行提交,通过该方式可避免频繁进行智能索引维护和随机io。
    另外,还可以将多条insert语句转换成insert into … value(…),(…)串的形式,以该方式可降低执行多条语句时频繁进行语法解析的代价。

Insert into select 方式:
Insert Into … Select …应用pipeline方式,首先会对Select部分进行查询并将物化结果存入到buffer中,buffer满了就会对目的表进行插入操作,然后再物化写入下一批,如此往复,最终进行统一提交。

2、Update

update语句的实现逻辑,可以理解为先进行一个查询,然后根据查询结果进行相应的更新。如:
update t1, t2 set t1.a = t2.a where t1.a = t2.a ;
对应的查询及更新部分分别为
select t1.a, t2.a from t1, t2 where t1.a = t2.a ; 
set t1.a = t2.a 
select部分对应的查询结果为一个TempTable类,可以理解为一个table,它包含了所有与更新相关的列(t1.a, t2.a),基于该TempTable,则可以完成相应的update操作。
具体实现时,TempTable不需要物化,因为全部操作都在引擎内部执行,直接访问列数据即可。

3、Delete

delete语句的实现逻辑,可以理解为先进行一个查询,然后根据查询结果进行相应的删除。如:
DELTE FROM table1 … WHERE …table1.col1 ...
    =>
    SELECT table1.col1 FROM table1 … WHERE … 
    DELETE table1.col1
在进行查询时,针对查询出的结果无需进行物化,只记录了需要delete的行号。
在进行删除时,在对应的记录行上置标记位,并在commit 阶段将其保存到元数据文件中。

评论

登录后才可以发表评论
用户头像
GBase用户28017发表于 9个月前
学习
崔哥发表于 7个月前
昔在长安醉花柳,五侯七贵同杯酒。气岸遥凌豪士前,风流肯落他人后?夫子红颜我少年,章台走马著金鞭。文章献纳麒麟殿,歌舞淹留玳瑁筵。与君自谓长如此,宁知草动风尘起。函谷忽惊胡马来,秦宫桃李向明开。我愁远谪夜郎去,何日金鸡放赦回?
半夏发表于 2个月前
学会了
曾浩轩发表于 2个月前
三人行必有我师