(十三)数据库查询处理之QueryExecution(2)

实验室这一周真的忙爆(虽然都是各种打杂的活)所以拖了很久终于在周末(摸鱼)把实验3做完了。同时准备把和查询这一块有关的博客补一下。然后就进入最后一个project并行和锁那里。不过下周华为的比赛就开了。争取四月份之前把这些东西全都搞定。等到四月份的时候开一个新坑(leveldb源码阅读笔记)


1. 并行和分布式的区别

如今数据库分布在多种资源中,以提高DBMS的不同方面

并行DBMS

  1. 资源在物理上靠近
  2. 资源之间可以高速互通
  3. 资源交互是非常廉价和可靠的

分布式DBMS

  1. 各种资源之间可以离得很远
  2. 资源之间较慢速的互连进行通信
  3. 通信成本和问题不容忽视。(也就是很大)

2. 进程模型

1. PROCESS PER WORKER

每一个worker就是一个独立的进程。worker可以理解为打工人。执行任务

整个流程大致如下

  1. 你的应用程序想要和数据库进行交互
  2. 通知调度器。调度器会fork一个子进程(也就是产生一个worker)来执行这个任务
  3. 调度器会告诉应用程序你直接和worker进行交互就可
  4. 随后worker访问数据库
  5. worker将得到的结果传回应用程序

这个模型的好处是。如果一个进程出现了bug整个系统不会出现问题。只需要通知调度器在fork一个进程就好了

2. PROCESS POLL

进程之间仍然共享内存。并且依赖于操作系统的调度。每个worker可以使用在进程池中任意的一个进程

3. THREAD PER WORKER

一个进程可以有许多worker线程

整个流程大致如下

应用程序直接和worker的线程进行交互

优点

  1. 线程间的切换比进程间的切换要轻量级的多
  2. 这样就不需要管理共享内存了(因为一个进程的多个线程就会共享这个进程的内存。这样我们无需管理多个进程之间的内存共享)

注意这并不意味着dbms里的所有任务一定要多线程来执行

DBMS永远知道的比操作系统更多


3. INTER-VS INTRA-QUERY PARALLELISM

1. I N T E R-Q U E R Y P A R A L L E L I S M

通过允许多条查询同时进行来提高整体的性能。

如果多条查询语句只是读数据库的话,那我们在不同的查询之间几乎不需要加任何限制条件

但是如果写操作比较多的话就很麻烦了

2. I N T R A-Q U E R Y P A R A L L E L I S M

这个就是流水线操作。csapp第四章讲的非常清楚

通过并行执行单条查询语句来提高单个查询的性能。可以从生产者消费者的角度来理解

下面来看一个例子 -> PARALLEL GRACE HASH JOIN

这个非常简单我们让一个worker去执行一行的join操作然后输出结果就好


4. INTRA-QUERY PARALLELISM 的方法

1. 方法1 Intra-Operator(水平方法的并行)

将整个查询操作分解为几个独立的片段,这些片段对不同的数据集执行相同的功能

例如下面的例子(截图警告)

其中A1承担一小部分任务

每个不同的worker承担不同的任务

最上面的Exchange操作基本可以分为三个类型

  • case1 Gather

    将来自多个worker的结果合并到一个输出流中。最上层的Exchange操作必须始终是Gather

  • case2 Repartion

    将多个输入流重新打乱成多个输出流

  • case3 Distribute

    将单个输入流拆分为多个输出流

对于上面这个比较复杂的例子

  1. 首先A的所有worker和B的所有worker完成Hash join的基本操作
  2. 然后新的4个worker进行探测操作把结果汇入 根节点的Exchange得到结果

2. 方法2 INTER-OPERATOR PARALLELISM(垂直方向)

这也叫做pipelined parallelism.

这种方法非常好理解就是位于下层的worker把得到的结果向上传递给上层的worker

3. 方法3 Bushy Parallelism

方法1和2的结合版本

SELECT*FROM A JOIN B JOIN C JOIN D

在这个方法里一个woker1和worker同时执行整条语句的两个部分。并且会将执行之后得到的结果往上传递给worker3和worker4

因为磁盘的限制。所以使用额外的进程/线程可能并不会产生很好的效果。接下来介绍I/O的并行


5. I / O PARALLELISM

1. MULTI-DISK PARALLELISM

拓展阅读RAID

RAID0形式

不同的page存储在不同的存储设备中

RAID1形式

不同的存储设备中存储着相同的数据。


6. PARTITIONING

逻辑上的一张表。我们可以把它分成几个独立的部分放在不同的物理资源中。并且理想情况下分区程序应该对用户是透明的

下面来看两种不同的划分方法

1. 垂直划分

顾名思义就是按照列来划分。我们可以把不同的列放在不同的物理资源中

2. 水平划分

水平划分就是把不同的tuple(元组)放在不同的物理资源中

(十三)数据库查询处理之QueryExecution(2)的更多相关文章

  1. 《万能数据库查询分析器》实现使用SQL语句直接高效地访问文本文件

    <万能数据库查询分析器>实现使用SQL语句直接高效地访问文本文件 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要    用SQL语句来直接访问文本文件?是在做梦吗? ...

  2. Django 数据库查询集合(多对多)

    Django 数据库查询集合(双下划线连表操作) 目录: 1.Django环境搭建 2.数据库建表 3.写入数据 4.查询语句 Django环境搭建 1.安装django pip install dj ...

  3. CRL快速开发框架系列教程十三(嵌套查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  4. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  5. [转]C#反射,根据反射将数据库查询数据和实体类绑定,并未实体类赋值

    本文来自:http://www.cnblogs.com/mrchenzh/archive/2010/05/31/1747937.html /****************************** ...

  6. 各数据库查询前N条记录的SQL语句

    sql在不同数据库查询前几条数据 1. ORACLE SELECT * FROM TABLE_NAME WHERE ROWNUM <= N;  HQL: from table_name t or ...

  7. Atitit  DbServiceV4qb9 数据库查询类库v4 新特性

    Atitit  DbServiceV4qb9 数据库查询类库v4 新特性     V4新特性 安全特性,屏蔽了executeUpdate,使用v2版 Sql异常转换,特别转换了DuplicateEnt ...

  8. C#与mysql做ASP.NET网页数据库查询速度测试

    两种方法是:1,使用mysql数据库的存储过程:2,C#编码,做网页后台与mysql数据库连接,前台测试显示测试过结果下面我将分别讲解两种方法的具体实现. 1,使用mysql数据库的存储过程插入万条大 ...

  9. 第九十九天上课 PHP TP框架 数据库查询和增加

    在Model文件夹下创建模型,文件命名规则 : 表名Model.class.php <?php namespace Home\Model; use Think\Model; class yong ...

随机推荐

  1. CodeForces - 915E 动态开点线段树

    题目 晚上有n个亮着的灯泡,标号从1到n. 现在存在2种操作,如下: 操作1,关掉标号 [l,r] 区间的灯 操作2,打开标号 [l,r] 区间的灯 下面有q次询问,每次询问执行其中一种操作,询问格式 ...

  2. Gym 2009-2010 ACM ICPC Southwestern European Regional Programming Contest (SWERC 2009) A. Trick or Treat (三分)

    题意:在二维坐标轴上给你一堆点,在x轴上找一个点,使得该点到其他点的最大距离最小. 题解:随便找几个点画个图,不难发现,答案具有凹凸性,有极小值,所以我们直接三分来找即可. 代码: int n; lo ...

  3. PowerShell随笔2---初始命令

    PowerShell便捷之处 PowerShell中兼容运行cmd的命令,比如 ipconfig.ping命令等 PowerShell的命令更友好,可读性更强.比如停止一个服务 CMD命令:sc st ...

  4. ABP设置管理模块: Abp.SettingUi

    开源地址: https://github.com/EasyAbp/Abp.SettingUi 一直想宣传一下SettingUi, 因为 懒 工作比较忙, 所以才拖到今天. 关于ABP就不需要我再多废口 ...

  5. anaconda jupyter notebook 启动方法

    介绍 anaconda jupyter notebook是一种基于浏览器的python编译环境.(大概) 使用时可能因为浏览器缓存造成问题. 但是很方便. 启动方法 anaconda navigato ...

  6. UA 广告 All In One

    UA 广告 All In One UA 广告是什么 广告投放 / 市场营销 互联网营销和分析专用名词速览 http://www.chinawebanalytics.cn/digital-marketi ...

  7. 前端使用 js 如何实现大文件上传

    前端使用 js 如何实现大文件上传 大文件上传 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  8. Express All In One

    Express All In One express.js, node.js web framework # v4.17.1 Latest, on May 26, 2019 $ yarn add ex ...

  9. Angular Learning Paths

    Angular Learning Paths Angular Expert refs https://app.pluralsight.com/search/?q=angular xgqfrms 201 ...

  10. console.log & front-end jobs

    console.log & front-end jobs bind & function let log = console.log; let obj = {}; log(obj); ...