OceanBase 数据库存储引擎设计为 shared-nothing 架构,存储引擎本身不提供跨存储节点的读写数据的能力,因此对于一个需要跨节点访问数据的 SQL 查询来说,需要 SQL 引擎按照 SQL 语义将执行计划拆分成多个 subplan,通过 RPC 的形式来达到对跨节点的数据读写能力,称这种执行方式为 ship function。
对于查询结果集较小,仅仅是因为数据分布跨节点而导致的分布式查询的 TP场景,远程拉取数据的开销将远远小于将 subplan 调度到对应数据节点上的执行方式,称这种选择远程访问数据的执行方式为 ship data。从 OceanBase 数据库 V3.2 版本开始,OceanBase 数据库设计了 DAS(Data Access Service)层,来提供远程数据访问的能力(ship data)。
DAS 只提供跟存储的远程交互能力,并不感知 SQL 的具体语义,只是对相应的接口做一层封装,并提供这些接口多分区操作的能力。DAS 不提供对分区内的数据并发访问的能力,对于需要做分区内并行的 SQL 计算,需要上层的调度框架来实现相应的并行能力,因此 DAS 的数据访问方式和事务控制以 partition 为基本粒度进行,一个 partition 对应一个 DAS Task,并提供对数据的 RPC 访问和流控能力。
启用 DAS 执行
DAS 执行方式是基于新执行引擎实现,启用或者关闭 DAS 执行受集群级别的隐藏配置项控制,默认为打开。
使用新引擎命令。
obclient > ALTER SYSTEM SET _enable_static_typing_engine=true;开启全局 DAS 功能。
obclient > set _enable_dist_data_access_service=true;注意
OceanBase 数据库 V4.x 版本不再需要设置参数与变量。
在算子层面,DAS 执行与 PX 执行机制互斥,使用 DAS 的算子无法使用并行执行。但在整个 QUERY 层面,既可以有 DAS 算子,也可以有 PX 算子。
查看 DAS 执行
是否启用了 DAS 执行方式,可以从 EXPLAIN 的执行计划上体现,执行计划中的 TABLE SCAN 会展示成DISTRIBUTED TABLE SCAN,例如:
explain select /*+index(t1 i1)*/ * from t1;
输出结果如下。
==================================================
|ID|OPERATOR |NAME |EST. ROWS|COST|
--------------------------------------------------
|0 |TABLE LOOKUP |t1 |4 |114 |
|1 | DISTRIBUTED TABLE SCAN|t1(i1)|4 |37 |
==================================================
适用版本
OceanBase 数据库 V3.2(含)以上版本。