GBase 8a 增删改原理介绍
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 阶段将其保存到元数据文件中。
评论
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526