对于 Shared-Nothing 的分布式系统来说,由于一个关系数据表的数据会以分区的方式存放在系统里面的各个节点上,对于跨分区的数据查询请求,必然会要求执行计划能够对多个节点的数据进行操作,因而 OceanBase 数据库具有分布式执行计划生成和执行能力。

对于分布式执行计划,分区可以提高查询性能。如果数据库关系表比较小,则不必要进行分区,如果关系表比较大,则需要根据上层业务需求,审慎选择分区键,以保证大多数查询能够使用分区键进行分区裁剪以减少数据访问量。同时,对于有关联性的表,建议采用关联键作为分区键,采用相同分区方式,使用 table group 的方式将相同分区配置在同样的节点上,以减少跨节点的数据交互。OceanBase 数据库的优化器会自动根据查询和数据的物理分布生成分布式执行计划。

并行查询的工作原理

并行查询(Parallel Execution)是指通过对查询计划的改造,给每一个查询计划增加更多的 CPU 和 IO 处理能力,来提高单个查询的响应时间。并行查询技术可以用于分布式执行计划的执行,也可以用于本地查询计划的执行。

当单个查询所要访问的数据不在一个节点上的时候,需要通过数据重分布的方式,将相关的数据分布到同样的计算节点进行计算,以每一次的数据重分布节点为上下界,OceanBase 数据库的执行计划在垂直方向上被划分为一个个的 DFO(Data Flow Object),而每一个 DFO 可以被切分为指定并行度个数的 task、并发执行以提高执行效率。典型的来说,当并行度被提高时,查询的响应时间会缩短,更多的 CPU、IO 和内存资源会被用于查询的执行。对于大数据量查询处理的决策支持系统或者数据仓库型应用来说,查询时间提升会尤为明显。

整体来说,并行查询的总体思路和分布式执行计划有相似之处,将执行计划分解之后,不同于串行执行将整个计划由单个执行线程执行,将执行计划的每个部分由多个执行线程执行,通过一定的调度的方式,实现执行计划的 DFO 之间的并发执行和 DFO 内部的并发执行。在在线交易(OLTP)场景下,也可以适用于批量更新操作,创建索引,维护索引等操作。

当系统满足以下条件时,并行查询可以有效提升系统处理性能:

  • 充足的 IO 带宽
  • 系统 CPU 负载较低
  • 充足的内存资源以满足并行查询的需要

如果系统没有充足的资源进行额外的并行处理,使用并行查询或者提高并行度并不能提高执行性能。相反,在系统过载的情况下,操作系统被迫进行更多的调度,上下文切换或者页面交换,可能会导致性能的进一步下降。

通常在 DSS(Decision Support Systems)系统中,大量分区需要被访问和数据仓库环境下,并行执行能够提升执行响应时间。OLTP 系统通常在批量 DML 操作或者进行 schema 维护操作时能够受益,例如进行 index 的创建等。对于简单的 DML 操作或者分区内查询以及涉及分区数比较小的查询来说,使用并行查询并不能很明显的提高查询响应时间。

还有需要注意的是,当想要通过并行查询得到最佳的性能表现时,系统的每一个组成部分需要共同的进行配置。因为任何一个部分的性能表现瓶颈都会成为制约整个系统表现的单点。