用scala实现一个sql执行引擎-(下)】的更多相关文章

执行 上一篇讲述了如何通过scala提供的内置DSL支持,实现一个可以解析sql的解析器,这篇讲如何拿到了解析结果-AST以后,如何在数据上进行操作,得到我们想要的结果.之前说到,为什么选择scala作为这个引擎的实现,之一是scala提供了方便的DSL实现支持,其二是因为作为一门函数式编程语言,scala提供了丰富对于集合操作的函数.此外,函数在scala中是一个独立的类型,所以能够把现有的函数进行组合,得到更为强大的函数(和上一篇提到的用解析组合子组合已有的解析器得到更强大的解析器一样).…
前言 在实时计算中,通常是从队列中收集原始数据,这种原始数据在内存中通常是一个java bean,把数据收集过来以后,通常会把数据落地到数据库,供后面的ETL使用.举个一个简单的例子,对一个游戏来说,为了统计某个游戏,某个服务器的登陆注册 等事件,原始数据对应的java bean可能会是这样: public class Event { private String userName; private String game; private String server; private Stri…
自己实现一个SQL解析引擎 功能:将用户输入的SQL语句序列转换为一个可运行的操作序列,并返回查询的结果集. SQL的解析引擎包含查询编译与查询优化和查询的执行,主要包含3个步骤: 查询分析: 制定逻辑查询计划(优化相关) 制定物理查询计划(优化相关) 查询分析: 将SQL语句表示成某种实用的语法树. 制定逻辑查询计划: 把语法树转换成一个关系代数表达式或者类似的结构,这个结构通常称作逻辑计划. 制定物理查询计划:把逻辑计划转换成物理查询计划,要求指定操作运行的顺序,每一步使用的算法,操作之间的…
自己动手写SQL执行引擎 前言 在阅读了大量关于数据库的资料后,笔者情不自禁产生了一个造数据库轮子的想法.来验证一下自己对于数据库底层原理的掌握是否牢靠.在笔者的github中给这个database起名为Freedom. 整体结构 既然造轮子,那当然得从前端的网络协议交互到后端的文件存储全部给撸一遍.下面是Freedom实现的整体结构,里面包含了实现的大致模块: 最终存储结构当然是使用经典的B+树结构.当然在B+树和文件系统block块之间的转换则通过Buffer(Page) Manager来进…
前言 SQL作为Web开发是永远离开不的一个话题,天天写SQL,可是你知道一个SQL是如何执行的吗? select name from user where id = 1; 上面是一个简单的查询语句,交给数据库去执行,然后返回name.看起来很简单,可是内部的执行过程却很多人都不知道. 今天就把MySQL拆开看看,看一下它究竟是怎么工作的. SQL基本架构 从上图可以看出,MySQL分为Server层和存储引擎层 Server层 连接器 连接器主要是与客户端建立连接, 包含本地socket和大多…
这是个终极问题,因为优化本身的复杂性实在是难以总结的,很多时候优化的方法并不是用到了什么高深莫测的技术,而只是一个思想意识层面的差异,而这些都很可能连带导致性能表现上的巨大差异. 所以有时候我们应该先搞清楚需求到底是什么,SQL本身是否合理,这些思考很可能会使优化工作事半功倍.而本文是假设SQL本身合理,从Oracle提供给我们的一些技术手段来简单介绍下Oracle数据库,该如何使用一些现有的技术来优化一个SQL执行的性能. 确定需要优化的SQL文本及当前SQL执行计划 确定SQL涉及的所有表及…
一.SQL执行过程 1.用户连接数据库,执行SQL语句: 2.先在内存进行内存读,找到了所需数据就直接交给用户工作空间: 3.内存读失败,也就说在内存中没找到支持SQL所需数据,就进行物理读,也就是到磁盘中查找: 4.找到的数据放到内存中,在内存进行数据过滤再放到会话工作空间. 5.假设会话工作空间需要暂存结果集进行排序,但空间不足的话,就会借用磁盘tmpdir,最后再将结果返回给用户. 注: 用户会话空间是内存中分配出来的一个工作空间,而innodb_buffer_pool是innodb存储引…
前言 一个SQL从词法解析.语法解析.逻辑执行计划.物理执行计划最终转换为可以执行的RDD,中间经历了很多的步骤和流程.其中词法分析和语法分析均有ANTLR4完成,可以进一步学习ANTLR4的相关知识做进一步了解. 本篇文章主要对一个简单的SQL生成的逻辑执行计划物理执行计划的做一个简单地说明. 示例代码 case class Person(name: String, age: Long) private def runBasicDataFrameExample2(spark: SparkSes…
需求:一个SQL执行特别慢,无法返回结果,需要进行优化,最终返回结果即可. 一.SQL分析 二.尝试执行,观测执行计划 三.修改SQL 四.问题总结 一.SQL分析 )SQL文本,执行时间,执行用户 用户brjljk sql执行时间,2935分钟 sql_text select c.hphm, c.ccdjrq, c.clpp1, c.clxh, c.zt, c.syr, c.wfsj, c.wfxw, c.dsr, c.xxly, c.syq, c.wfsj1, d.wfnr, e.dlmc,…
spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql…