0
点赞
收藏
分享

微信扫一扫

CMU 15-445/645-Note6-执行篇-Query Execution

_阿瑶 2022-03-13 阅读 56

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

举报

相关推荐

0 条评论