背景
所有并行执行查询的DBMS都提供了以下几个好处:
- 提高吞吐量和延迟性能。
- 提高可用性。
- 可能降低总体拥有成本(TCO)。
在并行或分布式DBMS中,数据库分布在多个资源上以提高并行性。
数据库“显示”为应用程序的单个数据库实例。单节点DBMS的SQL查询应该在并行或分布式DBMS上生成相同的结果。
并行DBMS:
- 节点在物理上彼此靠近。
- 节点与高速LAN连接。
- 假设节点之间的通信成本快速可靠。
分布式DBMS:
- 节点可以相距很远。
- 节点使用公共网络连接。
- 节点之间的通信成本较慢,故障也不容忽视。
并行的类型
- Inter-Query:DBMS同时执行不同的查询。这可以提高吞吐量并减少延迟。查询更新数据库时,并发性很棘手。
- Intra-Query:DBMS并行执行单个查询的操作。这减少了长时间运行的查询的延迟。
Process Models
DBMS Process Model定义了系统如何支持来自多用户应用程序/环境的并发请求。
DBMS由更多或更多的Worker组成,他们负责代表客户端执行任务并返回结果。
方法#1 - Process per Worker:
- 每个worker都是一个单独的OS进程,因此依赖于OS调度程序。
- 将共享内存用于全局数据结构。
- 进程崩溃不会导致整个系统崩溃。
方法#2 - 进程池:
- Worker使用池中任何可用的任何进程。
- 仍然依赖于OS调度程序和共享内存。
- 由于无法保证在查询之间使用相同的进程,因此这种方法可能对CPU缓存局部性不利。
方法#3 - 每个WORKER一个线程:
- 具有多个工作线程的单个进程。
- DBMS必须管理自己的计划。
- 可能会或可能不会使用调度线程。
- 虽然线程崩溃(可能)会导致整个系统崩溃,但我们必须确保编写高质量的代码以确保不会发生这种情况。
使用多线程体系结构的优点是每个上下文切换的开销更少,并且您不必管理共享模型。 每个工作者模型的线程并不意味着您具有查询内并行性(intra-query
parallelism)。
对于每个查询计划,DBMS必须决定执行的位置,时间和方式:
• 它应该使用多少个任务?
• 它应该使用多少个CPU核心?
• 任务执行的CPU核心是什么?
• 任务应在何处存储其输出?
多个QUERY的并行
如果都是读,比较简单。涉及到写,很难做对。要用到隔离或者锁。我会在之后的2PL,OCC,MVCC里介绍
单个QUERY的并行
此类并行性的目标是通过并行执行其运算符来提高单个查询的性能。 每个关系运算符都有并行算法。
Intra-Operator Parallelism
- 查询计划的运算符被分解为独立实例,这些实例在不同的数据子集上执行相同的函数。
- DBMS在查询计划中插入exchange运算符,以合并来自子运算符的结果。
交换运算符阻止DBMS在计划中执行它上面的运算符,直到它从子节点接收到所有数据
Inter-Operator Parallelism
- 操作重叠,以便将数据从一个阶段传递到下一个阶段而不实现。这有时称为流水线并行。
-
此方法未在传统关系DBMS中广泛使用。 并非所有算子都能在他们看到孩子们的所有元组之前发出输出。 这在流处理系统中更常见,该系统是在输入元组流上不断执行查询的系统。
image.png
IO 并行
如果磁盘始终是主要瓶颈,则使用其他进程/线程并行执行查询将无法提高性能。因此,我们需要一种方法将数据库拆分为多个存储设备。
多磁盘并行
配置OS /硬件以将DBMS的文件存储在多个存储设备中。可以通过存储设备和RAID配置来完成。这对DBMS是透明的。它不能让Worker在不同的设备上运行,因为它不知道潜在的并行性。
基于文件的分区
某些DBMS允许您指定每个单独数据库的磁盘位置。缓冲池管理器将页面映射到磁盘位置。如果DBMS将每个数据库存储在单独的目录中,这在文件系统级别也很容易。但是,可能会共享日志文件。
逻辑分区
将单个逻辑表拆分为单独存储/管理的不相交的物理段。这种分区对于应用程序来说理想地是透明的。也就是说,应用程序应该能够访问逻辑表而无需关心事物的存储方式。
垂直分区:
- 将表的属性存储在单独的位置(如列存储)。
-
必须存储元组信息以重建原始记录。
image.png
水平分区:
- 根据某些分区键将表的元组划分为不相交的段。
-
有不同的方法来决定如何分区(例如,散列,范围或谓词分区)。每种方法的功效取决于查询。
image.png