openGauss源码解析(59)

openGauss源码解析:存储引擎源码解析(27)

5) 截断表

图4-48 截断表时序图

如图4-48所示,用户截断现有的内存表内容时,openGauss通过FDW适配器将请求转发给MOT存储引擎。

正常事件流:FDW从MOT引擎中检索表对象并转发截断表的请求。表中每个索引的索引数据被截断,并且将DDL命令持久化到重做日志。

P1:在此异常事件流中,没有找到该表。此错误条件被静默忽略,FDW不会向openGauss报告错误。

P2:在此异常事件流中,由于资源限制(内存不足),无法执行操作。

6) INSERT行

图4-49 INSERT行时序图

如图4-49所示,openGauss通过FDW适配器将请求转发给MOT存储引擎。可以通过自动提交(auto-commit)INSERT行,也可以在事务中INSERT行。

正常事件流:FDW从MOT引擎中检索表对象并创建新的行对象。由于内存引擎不同于磁盘引擎,不使用基于页面的间接访问形式,因此需要将行格式从openGauss行格式转换为MOT行格式(MOT将这种行格式转换称为Pack,反向转换称为unpack)后才能INSERT到表中。随后为该表的每个索引创建一个键。INSERT行的整个请求被传递到当前Txn,随后将该请求转发到并发控制模块,并持久化到重做日志。

P1:在此异常事件流中,由于资源限制(内存不足),无法执行操作。

P2:在此异常事件流中, INSERT行失败,原因如下:①内存分配失败;②在主节点上违反了唯一约束。在这两种情况下,父事务都将使用正确的错误代码中止。

7) SELECT/UPDATE/DELETE(计划阶段)

图4-50 SELECT/UPDATE/DELETE(计划阶段)时序图

用户可以在内存表中SELECT/UPDATE/DELETE行。每个操作分为两个阶段:计划阶段和执行阶段。图4-50主要关注计划阶段。

每个SELECT/UPDATE/DELETE的规划阶段包括选择最佳执行计划。为此,openGauss准备了几个可能的执行路径,并要求FDW估计每个此类路径的开销,以便openGauss可以选择最佳的执行路径。

正常事件流:openGauss调用GetForeignRelSize接口,FDW从MOT中检索相关表对象,并用启动成本和总成本估计初始化此查询的FDW状态。openGauss调用GetForeignPaths触发所有涉及索引对象的开销计算。最后,openGauss调用GetForeignPlan触发结束整个过程,包括查询子句对本地和远程排序,以及根据所选执行路径对FDW状态进行序列化。PREPARE语句的执行在此结束,其他语句待执行的部分将在执行阶段中描述。

P1:在此异常事件流中,由于资源限制(内存不足),无法执行操作。

8) SELECT/UPDATE/DELETE(执行阶段)

图4-51 SELECT/UPDATE/DELETE(执行阶段)

如图4-51所示,计划阶段完成后,执行阶段开始。

正常事件流:openGauss调用BeginForeignScan,FDW检索相关表并初始化查询的FDW状态。在进行UPDATE/DELETE操作时,openGauss通过调用BeginForeignModify接口触发一个额外的初始化阶段,然后返回NULL。openGauss通过调用IterateForeignScan接口进行如下操作:①仅在需要时一次性初始化游标;②在当前事务对象中查找下一行;③将行数据从MOT格式转换为openGauss格式;④游标前进;⑤返回包含unpack行的槽位。重复此过程,直到游标中不再有行,并且返回NULL到openGauss。然后openGauss应用本地条件/查询子句等本地过滤器来决定是否继续处理该行。在进行SELECT操作时,该行将被添加到结果集中,并返回结果集给用户。进行UPDATE和DELETE操作需执行的其余部分将在后文中进行描述。

9)UPDATE(结束执行阶段)

图4-52 UPDATE(结束执行阶段)时序图

执行SELECT、UPDATE和DELETE语句的公共部分后,每个语句的剩余部分有所不同。图4-52描述UPDATE的剩余部分。

正常事件流:openGauss为特定的更新元组调用ExecForeignUpdate接口。FDW更新当前事务对象中最后一行的状态以进行并发控制,然后FDW将行数据从openGauss格式转换为MOT格式,并通过覆盖该行的方式完成变更字段的更新。该操作在重做日志中持久化,并返回openGauss。

P1:在此异常事件流中,由于并发控制事务对象的行状态更新失败。在这种情况下,父事务将以适当的错误代码中止。

10) DELETE行(结束执行阶段)

图4-53 DELETE行(结束执行阶段)

图4-53描述了DELETE操作执行的剩余部分。

正常事件流:openGauss为特定更新的元组调用ExecForeignDelete接口。FDW更新当前事务对象中最后一行的状态以进行并发控制,然后将操作持久化到重做日志中,并返回openGauss。

P1:在此异常事件流中,由于并发控制事务对象的行状态更新失败。在这种情况下,父事务将以适当的错误代码中止。

posted @ 2024-04-29 16:52  openGauss-bot  阅读(7)  评论(0编辑  收藏  举报