0.写在前面
based on CMU 15-445/645 2020fall, Lecture #12.
1:执行模型(PROCESSING MODEL)
DBMS 的执行模型定义了系统执行查询计划(query plan)。每一个query plan都要实现一个next函数和一个init函数,对于next函数每次调用时,返回一个元组或空标记(如果没有更多元组)。
主要有三种方法:
Approach #1: Iterator Model
Approach #2: Materialization Model
Approach #3: Vectorized / Batch Model
我们一一介绍。
1.1 Iterator Model
每次处理一个tuple。
这里的evalPred(t)就等价于 S.value > 100。
1.2 Materialization Model
一次处理所有输入,然后一次获得它的所有输出。
Materialization Model更适合 OLTP ,因为仅查询一次访问少量元组。
→ 降低执行/协调开销。
→ 更少的函数调用。
不适合大容量的 OLAP 查询中间结果。
1.3 Vectorized / Batch Model
每次处理一个Batch。
适合OLAP ,因为它大大减少了每个操作的调用次数。
2:Scan
对于Scan如何进行优化?
2.1 Zone Map
保存该页数据的一些统计信息,比如min\max\avg\cnt等,以便更快的判断。但是这带来了额外的写的开销。
如果我们执行左边的查询,通过Zone Map知道,最大值为400,我们就不需要访问这个Page。
2.2 Late Materialization
在列存储时,可以在一开始只读用于筛选的attribute。最后才通过筛选后record ID(offset)来读整个tuple/投影的attribute,推迟实例化的过程。
2.3 index scan
如果有多个Index,可以使用bitmap来做多个Index的谓词判断。把集合结合起来最后根据另一个查询条件获得结果
3:并发模型
并行DBMS:
1)资源在物理上靠近
2)资源之间可以高速互通
3)资源交互是非常廉价和可靠的
分布式DBMS:
1)各种资源之间可以离得很远
2)资源之间较慢速的互连进行通信
3)通信成本和问题不容忽视。(也就是很大)
3.1 Process Per Worker
流程如下:
1)你的应用程序想要和数据库进行交互。
2)通知Dispatcher。Dispatcher会fork一个子进程(也就是产生一个worker)来执行这个任务。
3)Dispatcher会告诉应用程序你直接和worker进行交互就可。
4)随后worker访问数据库,worker将得到的结果传回应用程序。
优点与缺点:
它的调度依赖于OS调度器,并且多进程之前需要通过shared memory进行数据共享,单个worker的失败不会引起系统的崩溃。
3.2 Process Pool
此模型和上面的模型的区别是不再是由Dispatcher管理进程,而是通过一个Woker Pool,任务会挂配到进程池中的空闲进程中执行。而且数据的返回需要通过Dispatcher返回给用户。
3.3 Thread per DBMS Worker
DBMS实现自己的调度。由于线程的切换代价更低,而且可以共享堆栈,所以线程成了代替进程的好选择。此时,每个DBMS只包含一个进程,和许许多多线程。
4:Execution Parallelism
4.1 Inter-Query
通过允许多条查询同时进行来提高整体的性能。
它会提升整体表现,但是会影响事务的隔离性。
4.2 Intra-Query
1)Intra-operator Parallelism (Horizontal):将数据拆分为多个子集,在子集中并行的执行operator,最后通过exchange operator合并数据或者重新对合并的结果分片。
上述例子:
1)首先A的所有worker和B的所有worker完成Hash join的基本操作
2)然后新的4个worker进行探测操作把结果汇入 根节点的Exchange得到结果
2)Inter-operator Parallelism (Vertical):以流水线的方式执行operator。即operator不需要等前一步operator执行完成,而是形成一个流水线。其对于传统关系型语句并不友好,因为Join,Aggregate等操作是需要scan所有的数据后才能执行。
3)Bushy Parallelism:
5: I/O Parallelism
如果磁盘始终是主要瓶颈,则使用其他进程/线程并行执行查询将无法提高性能。因此,我们需要一种方法将数据库拆分为多个存储设备。
5.1 MULTI-DISK PARALLELISM(多磁盘并行)
利用多块磁盘提升I/O速度,比如RAID。
5.2 Database Partitioning(数据库分区)
将数据库分为多个segment,分开存储,这种方案在分布式数据库中更常见。
具体切分的方案有两种:
1)Vertical Partitioning(按列切分):将表的属性存储在单独的位置。
2)Horizontal Partitioning(按行切分):根据某些分区键将表的元组划分为不相交的段。有不同的方法来决定如何分区(例如,散列,范围或谓词分区)。
参考:
https://zhuanlan.zhihu.com/p/374807916
https://www.jianshu.com/p/ce3b526d982f
https://www.cnblogs.com/JayL-zxl/p/14497016.html