关系代数的并行计算

从Dremel和Impala的学习引申出了SQL查询的并行执行问题,于是借此机会深入学习一下关系数据库以及关系代数的并行计算。

Speedup和Scaleup

Speedup指用两倍的硬件换来一半的执行时间。Scaleup指两倍的硬件换来同等时间内执行两倍的任务。但往往事情不是那么简单,两倍的硬件也会带来其他问题:更多CPU带来的长启动时间和通信开销,以及并行计算带来的数据倾斜问题。

多处理器架构

共享内存:任意CPU都能访问任意的内存(全局共享)和磁盘。优点是简单,缺点是扩展性差,可用性低。

共享磁盘:任意CPU都能访问任何的磁盘,但是只能访问自己的主存。优点是可用性和扩展性比较好,缺点是实现复杂以及潜在的性能问题。

不共享:任意CPU都只能访问自己的主存和磁盘。优点也是扩展性和可用性,缺点是实现复杂以及复杂均衡。

混合型:系统整体上是shared nothing架构,但结点内部可能是其他架构。这样就混合了多种架构的优点。

数据分区

数据分区的目的就是:让数据库能够并行地读写数据,最大程度地挖掘I/O的潜力。常见的分区算法有:round-robin、范围索引、哈希。

关系运算并行化

关系代数自身的属性允许关系操作的并行化

并行查询处理主要分为四步:

?  翻译:将关系代数表达式翻译成查询树。

?  优化:重排join顺序,并选择不同join算法来最小化执行开销。

?  并行:将查询树转换成物理操作树,并加载到处理器。

?  执行:并行运行最终的执行计划。

首先将一条SQL语句翻译成查询树。

然后根据表大小、索引等情况,重新排列join顺序,并选择合适的算法。

关于join算法,常见的有以下几种:

?  Nested Loop join:思路很简单,相当于两层循环遍历,外层是驱动表,返回满足关联条件的行。适用于驱动表小(经过条件过滤后),而被驱动表上join字段有索引的情况。在两表都很大时效率很差。

for each row R1 in the outer table
    for each row R2 in the inner table
        if R1 joins with R2
            return (R1, R2)

?  Sort-merge join:思路也很简单,就是按join字段排序,然后进行归并排序。当join字段存在重复值时,相当于每个重复值形成了一个分区。Join字段是否排序和重复值的多少决定了sort-merge的效率。适用于两表都很大的情况,尤其当join字段上存在聚集索引时(相当于已经排好序了),效率很高。算法主要消耗在磁盘上。

?  Hash join:类似于存在重复值情况时的sort-merge,只不过是人为的使用哈希函数进行分区。思路是扫描小表建立哈希表(build阶段,小表也叫build表),然后逐行扫描大表进行比较(probe阶段,大表也叫probe表)。适用于两表都很大又没有索引的情况,限制是只适用于等值连接。算法主要消耗在CPU上。

此外,对于子查询还有semi joinanti join等算法。

最后将查询树变成物理操作树,也就是真正的执行计划。然后根据集群的资源情况,调度到合适的结点上进行并行计算。

参考资料

1 Parallel Query Processing

时间: 2024-10-15 11:33:39

关系代数的并行计算的相关文章

关系数据库_关系代数的并行计算_数据库分类

几张图看懂列式存储 从Dremel和Impala的学习引申出了SQL查询的并行执行问题,于是借此机会深入学习一下关系数据库以及关系代数的并行计算. Speedup和Scaleup Speedup指用两倍的硬件换来一半的执行时间. Scaleup指两倍的硬件换来同等时间内执行两倍的任务. 但往往事情不是那么简单,两倍的硬件也会带来其他问题: 更多CPU带来的长启动时间和通信开销, 以及并行计算带来的数据倾斜问题 多处理器架构 共享内存:任意CPU都能访问任意的内存(全局共享)和磁盘. 优点是简单,

关系代数的问题与尝试(2)关联运算及描述

下面我们来讲关系代数中的具体的问题,先谈关联运算的描述. 使用SQL对于单表进行查询并不是很难理解和实施,一般也就是选取字段.过滤.排序等,只有分组汇总稍复杂些,也不是多难懂. 但是,有意义的查询经常是多表的,比如查一下从北京到上海打了多少电话,存款超过10万元的人中本科学历及以上的有多少.这些都需要用到多表关联运算. SQL中用多表关联运算是用JOIN运算实现的,JOIN运算在关系代数中定义非常简单通用,就是两个表做笛卡尔积后再过滤. 简单的好处,就是适用面广,什么都能表达:但也有坏处,它没有

关系代数的问题与尝试(4)层次数据与交互

摘要: 本文来自北京润乾软件技术有限公司董事长蒋步星在清华大数据产业联合会的讲座. 说到交互运算,我们先复习一下OLAP这个概念.这个词字面的意思是在线分析,但在线分析实际上是在做什么事呢? 用户对发生的现象做出猜测 基于历史数据计算以验证或证伪猜测 根据计算结果修正猜测,重复此过程直到得出有益结论 业务用户看到了一些现象,他会猜是什么原因,猜完了以后开始拿着历史数据去看,看我猜的对不对.销售增长,可能是某个销售特别强,我要用数据去验证,销售量降低了,可能哪发灾害了,我要拿数据验证.猜对了,可能

关系代数的问题与尝试(5)云数据组织

摘要: 本文来自北京润乾软件技术有限公司董事长蒋步星在清华大数据产业联合会的讲座. 最后再简单说一下云计算的数据组织问题. 云数据有这样几个特征: 第一,多样性.云计算要解决多租户的问题,显然不同用户的数据结构经常是不一样的,即使同一个用户.同一块业务,数据结构在不同地域.不同时期都会不一样.象我们这样一个小公司的财务系统,数据结构都年年在变,今年没有这种销售提成,明年有了,就要增加一些字段或表来处理. 数据的多样性其实是很本质的需求,世界就是这么复杂.多样性在关系数据库的时代也存在.只不过关系

关系代数的问题与尝试(3)序运算与离散化

下面说序运算和离散化的问题. 人对有序计算是天然关心的.因为人最关心变化的东西,如果一个东西老不变,他不关心.这个东西变了,比昨天怎么样,比去年怎么样,他就会很关心,这个时候序运算就很重要了. 但是关系代数沿用了数学上的无序集合的概念,导致早期SQL没有办法直接做序运算.其实SQL的运算体系是完备的,它可以生成序号再去JOIN来实现序运算. 比如计算一只股票涨了多少钱,用早期SQL写出来是这样的: 对于一个用C++或JAVA的程序员会觉得这不可思议,这个运算怎么要写得这么麻烦,但它就是这样.先用

内存计算技术资料整理

先来看一下一张技术的全景图,其中涉及内存计算的技术标成红色. 1)事务处理:主要分为Cache(Memcached, Redis, GemFire).RDBMS.NewSQL(以VoltDB为首的)三部分,缓存和NewSQL数据库是关注的重点. 2)流式处理:Storm本身只是计算的框架,而Spark-Streaming才实现了内存计算式的流处理. 3)分析阶段的对比: ?  通用处理:MapReduce,Spark ?  查询:Hive,Pig,Spark-Shark ?  数据挖掘:Maho

关系运算 - 数据库系统原理

关系模型有三个重要组成部分: 数据结构.数据库中全部数据及其相互联系都被组织成"关系"(二维表格)的形式. 数据操纵.关系模型提供一组完备的高级关系运算,以支持对数据库的各种操作.关系运算又分为:关系代数和关系演算两类. 数据完整性规则.数据库中数据必须满足实体完整性.参照完整性.用户定义完整性等三类完整性规则. 关系代数的五个基本操作 关系代数是以关系(属性个数相同的元组的集合)为运算对象的一组高级运算的集合.关系代数的操作可以分为两类: 传统的集合操作:并.差.交.笛卡尔积(乘法)

2.2 关系代数运算

2.2.1 关系代数的五个基本操作 考核要求:达到“简单应用”层次 知识点:五个基本操作的含义和运算应用 (1)并(∪):两个关系需有相同的关系模式,并的对象是元组,由两个关系所有元组构成.  RUS≡{t| t∈R ∨t∈S} (2) 差(-):同样,两个关系有相同的模式,R和S的差是由属于R但不属于S的元组构成的集合.  R-S≡{t| t∈R ∧t 不属于S} (3)笛卡尔积(×):对两个关系R和S进行操作,产生的关系中元组个数为两个关系中元组个数之积.  R×S≡{t| t=< tr,t

关系模型关系模型

关系模型研究的内容 一个关系就是一个Table,关系模型就是处理Table的 在处理Table时涉及到以下内容 如何来描述一个Table,一个Table由哪些要素组成 规定Table上的操作和Table与Table之间的操作 定义表的约束与操作的约束 关系模型三要素 基本结构 (Table) 基本操作(U.-.X.σ.π.÷.∩) 完整性约束(实体完整.参照完整.用户自定义完整性) 表/关系 下图是对一张表的定义,我们称表也为关系. 域:所有可取的列值构成的集合.域的笛卡尔积的子集被成为关系.