我已经在之前的 《一条 SQL 在 Apache Spark 之旅(上)》、《一条 SQL 在 Apache Spark 之旅(中)》 以及 《一条 SQL 在 Apache Spark 之旅(下)》 这三篇文章中介绍了 SQL 从用户提交到最后执行都经历了哪些过程,感兴趣的同学可以去这三篇文章看看。

这篇文章中我们主要来介绍 SQL 查询计划(Query Plan)常见的处理模型(processing model)。数据库的处理模型定义了系统如何运行一个查询计划,不同的工作负载选择不同的处理模型。

在进入下面的文章之前,假设我们有以下的 SQL 查询:

SELECT R.id, S.cdate

FROM R JOIN S

ON R.id = S.id

WHERE S.value > 100

根据之前的文章,我们很快就可以将上面这条 SQL 的查询计划画出来:

系统为了处理这个查询计划,主要有三种执行模型:

  • 迭代模型(Iterator Model)

  • 物化模型(Materialization Model)

  • 向量化/批处理模型(Vectorized / Batch Model)

下面我们来简单介绍这三种执行模型的区别。

迭代模型(Iterator Model)

迭代模型又称 Volcano Model 或者 Pipeline Model。这种模型中的查询计划算子(query plan operator)都需要实现 next() 函数:

  • 每次调用的时候,operator 将返回一个元组(tuple)或一个空标记(null),空标记代表数据已经遍历完;

  • operator 需要实现一个循环,其调用子 operator 的 next() 函数,用于从子 operator 中获取数据,然后再处理它。

当今世界上绝大多数关系型数据库都是使用迭代模型的,比如 SQLite、MongoDB、Impala、DB2、SQLServer、Greenplum、PostgreSQL、Oracle、MySQL 等。我们熟悉的 Apache Spark 1.x 的 SQL 引擎也是基于这个模型做的(参见 Apache Spark作为编译器:深入介绍新的Tungsten执行引擎)。迭代模型的优点是抽象起来很简单,很容易实现,而且可以通过任意组合算子来表达复杂的查询。但是缺点也很明显,存在大量的虚函数调用,会引起 CPU 的中断,最终影响了执行效率;而且 Joins, Subqueries, Order By 等操作在其子 operator 返回数据之前会被 block 住。

物化模型(Materialization Model)

物化模型的处理方式是:每个 operator 一次处理所有的输入,处理完之后将所有结果一次性输出。由于这种模式中的 operator 其输出“物化”为单个结果,所以称为物化模型。在实现中,DBMS 一般会下推一些 hints 以避免扫描太多的数据。注意,这种模式可以返回物化的行数据或者单列数据。物化模型的处理流程如下:

物化模型更适合 OLTP 负载,因为这些查询每次只访问小规模的数据,只需要少量的函数调用。

向量化/批处理模型(Vectorized / Batch Model)

Vectorization Model 和 Iterator Model 类似,每个 operator 需要实现一个 next() 函数,但是每次调用 next() 函数会返回一批的元组(tuples)而不是一个元组。在 operator 内部,每次循环都会处理多个元组。批次的大小可以根据硬件或者查询数据进行配置的。可以看出Vectorization Model 是 Iterator Model 和 Materialization Model 的折衷。向量化模型的处理流程如下:

Vectorization Model 比较适合 OLAP 查询,因为其大大减少了每个 operator 的调用次数,也就简单减少了虚函数的调用。而且现代编译器和 CPU 在运行简单的循环时,是非常高效的。编译器会自动展开简单的循环,甚至在每个 CPU 指令中产生 SIMD 指令来处理多个元组。

Presto(参见 Aria 项目)、snowflake、SQLServer、Amazon Redshift 等数据库支持这种处理模式。

向量化/批处理模型与大数据

大家熟悉的 Apache Hive 从 0.13.0 版本开始也支持向量化执行模型,参见 HIVE-4160。为了在 Hive 中使用 vectorized query execution,我们必须以 ORC 格式来存储我们的数据,并且将 hive.vectorized.execution.enabled 参数设置为 true(默认是不开启的)。

另外,Apache Spark 2.x 的 SQL 引擎开始也支持向量化执行模型,参见 Apache Spark作为编译器:深入介绍新的Tungsten执行引擎。其效率比 Iterator Model 高出数倍。由于篇幅的原因,我们将在另外一篇文章介绍 Apache Spark 的 Vectorized Query Execution。

猜你喜欢

1、经典Hive-SQL面试题

2、在 Hive 中使用 OpenCSVSerde

3、如果你也想做实时数仓…

4、面试官问我Arrays.sort()为什么可以对int等数组进行排序,我跟面试官扯了半个小时

sql 循环处理数据_图文介绍 SQL 的三种查询计划处理模型,Spark 用了其中两个相关推荐

  1. sql 生成csv数据_创建包含SQL Server数据的动态生成的CSV文件

    sql 生成csv数据 介绍 ( Introduction ) A few months back, I presented a paper at SQL Saturday 327 in Johann ...

  2. python 流式计算框架_流式计算的三种框架:Storm、Spark和Flink

    我们知道,大数据的计算模式主要分为批量计算(batch computing).流式计算(stream computing).交互计算(interactive computing).图计算(graph ...

  3. 苹果手机怎么备份所有数据_手机数据丢失怎么办?三种备份神技,手机告别数据丢失...

    手机数据对现在的人都十分的重要,无论是照片,通讯录,短信,还是应用.桌面设定等等,这些数据的丢失,会给我们带来很多的麻烦,因此,做好手机数据备份,很是重要,那么有哪些好用的数据备份方式呢? 一.手机自 ...

  4. 【Arduino串口数据保存到excel中常用三种方法】

    [Arduino串口数据保存到excel中常用三种方法] 1. 前言 2. 利用excel自带Data Streamer读取 2.1 启用 Data Streamer 加载项 2.2 刷写代码并将微控 ...

  5. Excel中数据透视表数据源更新的三种方式

    Excel中数据透视表数据源更新的三种方式 1.在原有的基础上重新选择数据源 2.变数据源为表格形式,在创建一个透视表,之后如果添加的数据,选中透视表右键刷新即可 3.利用更新过的数据源再重新创建一个 ...

  6. java范式_【java编程】三种非主流的编程范式?

    原标题:[java编程]三种非主流的编程范式? [Java培训]:的小编在一些平台上看到的高端的编程技巧,今天给大家介绍相应的三种编程范式,在编程中就提到了提到了不少小众语言,在这里小编希望借此让大家 ...

  7. sql 不同数据库同步数据_什么是SQL数据同步

    sql 不同数据库同步数据 SQL Data Sync is a service that allows synchronizing data across multiple Azure SQL da ...

  8. java一次查询900w数据_一次SQL查询优化原理分析(900W+数据,从17s到300ms)

    有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fetching: ...

  9. sql 删除数据_从零开始学SQL:是什么、如何安装、基本语法、表格(创建、删除、更新)、数据(插入、删除、更新)...

    一.学习知识的黄金圈思维 用黄金圈思维分析自己学习SQL,能增加自己的效率和坚持下去的动力. 二.SQL基础知识 1.数据库概念: database ,按照数据结构来组织.存储和管理数据的仓库. 2. ...

最新文章

  1. Z 字形变换 C++实现 java实现 leetcode系列(六)
  2. 30-seconds-code——math
  3. 【实验手册】使用Visual Studio Code 开发.NET Core应用程序
  4. 如何通过 C# 实现对象的变更跟踪 ?
  5. 【转】abp vNext微服务框架分析
  6. 04.卷积神经网络 W3.目标检测
  7. 动手学CV-目标检测入门教程2:VOC数据集
  8. (十)用于面部识别的混合边缘人工智能:下一步
  9. VS2012 无法启动IIS Express Web服务器的解决方案
  10. TYVJ1467 通往聚会的道路
  11. WinCE6.0+ S3C6410 IIC驱动源码学习
  12. 在firefox 2.0.0.3中使用onenote 2007收集资料
  13. Java练习题——运算符
  14. 全球及中国汽车节能减排行业投资可行性及十四五发展趋势研究报告2021-2027年
  15. Krpano教程(一)简单使用
  16. 思科模拟器 --- 三层交换机的基本配置
  17. cassandra(scylladb)数据备份和还原
  18. Android Broadcast用法
  19. MT9M001的调试理解
  20. macbook bluetooth is not available (蓝牙不可用)

热门文章

  1. 龙贝格方法c语言,龙贝格算法
  2. ae中心点重置工具_(精品)AE从小白到大神之路(七)-AE动画—动效常见的设计方法...
  3. 对10亿个数据去重java_20 亿个数字在 4G 内存中如何去重排序:快来试一试 BitMap...
  4. laravel log 对象_swoole运行模式加速laravel应用的详细介绍(life)
  5. vue伸缩效果_Vue.js - 元素展开、收起动画效果组件(附:二级菜单的展开、收缩动画效果)...
  6. 苹果开发者_苹果优秀开发者实锤 微软VS Code将支持Apple Silicon
  7. MATALB(三)绘图命令
  8. Pyinstaller打包Django项目
  9. Django3 --- async
  10. 听说你盗图都盗绿了?