虚拟表设计原理

【产品名称】oceanbase数据库社区版

【产品版本】3.1

【问题描述】

请问ob中的虚拟表设计流程中,

1)OBServer在PartitionLocationCache查询各种虚拟表的数据源位置信息?PartitionLocationCache中关于各种虚拟表数据源位置信息是在初始化时就从RS获取填充好?后续这一小部分信息不再更改?

2)查询到虚拟表数据源位置分布情况(读本地虚拟表数据源?分布式数据源?只读RS?)后,对于只读RS的情况是直接和RS通讯获取所需虚拟表数据就返回给OBServer吗?对于需要分布式读多个server的情况是其中的一台server把查询计划发给每个server然后等待返回所有数据再合并吗?

  1. 虚拟表不同于普通的表,它的位置并不需要保存到location cache中。虚拟表分为两种,一种是每个节点都包含部分数据的,一种是只从RS构造数据的。前者可以视为每个节点是一个“分区”。
  2. 实际上这里并没有hardcode,而是做了一个巧妙的抽象。对于sql优化器和执行器来说,虚拟表是一个“分区表”,在查询和执行时和普通分区表没有不同。特别之处在于虚拟“分区表”的分区数是动态变化动态获取的。所以,对于只读RS还是读某些OBServer节点,都是属于SQL执行过程普通的“分区裁剪”优化。参考 ObSqlPartitionLocationCache 类。
1 个赞