Query Execution II
本节课主要介绍一些并行查询的机制。
Parallel vs Distributed Databases
并行数据库与分布式数据库的区别:
- 并行数据库的节点资源在物理位置上距离较近;分布式数据库则较远
- 并行数据库各节点间的数据交流较快且可靠;分布式数据库较慢且不可靠
- 并行数据库各节点间的数据传输延迟较小,可忽略不急;分布式数据库节点传输延迟较大,需要考虑在内
两种数据库在用户看来都是一样的,对于某个查询,返回最终结果;但是内部的设计却大不相同。
Process Models
本节介绍数据库中一些并行处理请求的模型,这些模型表明数据库系统是如何支持并行查询的。其基本思想是,系统中存在多个Worker;模型的不同点在于Worker的形式,如进程或线程。
Process per Worker
第一种模型是给每个Worker分配一个进程,由操作系统负责管理,如下图所示。数据库系统中的分配者将应用程序的请求分配给其中一个Worker,后续的请求数据与返回结果将由Worker进行接收和返回。
进程模型的优点是,其中一个进程的崩溃不会导致整个系统的崩溃;但是其去缺点就是严重依赖OS的调度,数据库系统难以自行调度进程。
Thread per Worker
第二种则是以线程的形式管理每一个Worker,为如今常用的数据库并行处理模型。这种模型使得线程的控制权在数据库系统手中而不依赖操作系统的调度,可以使用数据库自身的调度算法。
线程模型有许多优点,比如它减少了进程切换导致的上下文切换;但是一个线程的崩溃却可能导致整个数据库进程的关闭。
Inter-Query Parallelism
上一节介绍了整体的并行模型,这一节更近一步,介绍查询间的并行。所谓查询间并行,就是并行执行多个查询。如果所有查询都是只读的,那么没什么太大问题;但是如果存在对数据库关系进行修改的查询,则可能导致一些并发性问题,这个问题会在Leture 15进行讨论(使用事务)。
Intra-Query parallelism
这一节介绍查询内的并行,主要关注单个查询内的横纵向并行:操作内与操作间的并行。
- 操作内并行(横向):并行执行单个查询内的多个相同操作
- 操作间并行(纵向):并行执行单个查询内的多个不同操作
Intra-Operator Parallelism (Horizontal)
操作内并行就是把一个操作分配给多个Worker进行,每个Worker执行一部分,最后通过Exchange算子对结果进行合并,如下图所示。
Exchange算子一般有三种类型:
- Gather:将多个输入合并为一个输出
- Distribute:将一个输入分发为多个输出
- Repartition:将多个输入进行重新分区
Inter-Operator Parallelism (Vertical)
操作间并行的思想就和CPU流水线的思想是一致的,在运行一个算子的同时运行另一个算子,避免将中间结果输出到磁盘中,减少IO负担,故也称为流水线并行。这种方法在流处理系统中非常常见。下面是一个简单的例子,在join产生一条结果之后,将流向project算子,project算子与join算子并行处理。
I/O Parallelism
上面我们从并行模型讲到了查询并行以及操作并行,这一节是更底层的并行,即IO并行。IO一直是数据库系统的瓶颈,我们希望把IO任务分布到多个设备中进行并行处理,有两种并行化方法:多磁盘并行与数据库分区。
Multi-Disk Parallelism
故名思意,数据库文件分布在多个磁盘进行存储。但与存储介质交互的过程对数据库系统而言是透明的,由OS负责。
Database Partitioning
将数据库拆分为多个不相交的子集,进行分布式存储。对应用层而言是透明的。