自己实现一个SQL解析引擎
时间:2022-03-14 02:10
图1.SQL引擎间模块的调用关系
图2. SQL例句相应的分析树
图2. SQL例句相应的分析树
分析树的叶子节点为数字,字符串,属性等,其它为内部节点。
将图2的分析树转化为逻辑计划树,如图3所看到的。
图3. 图2分析树相应的逻辑计划
逻辑计划是关系代数的一种体现,关系代数拥有种基本运算符:投影 (π),选择 (σ),自然连接 (?),聚集运算(G)等算子。因此逻辑计划也拥有这些类型的节点。
逻辑计划的内部节点是算子,叶子节点是关系,子树是子表达式。各算子中最耗时的为连接运算,因此SQL查询优化的非常大一部分工作是减小连接的大小。如图3相应的逻辑计划可优化为图4所看到的的逻辑计划。
图4. 图3优化后的逻辑计划
完毕逻辑计划的优化后,在将逻辑计划转化为物理查询计划。图4的逻辑计划相应的物理查询计划例如以下:
图5. 图4相应的物理查询计划
物理查询计划针对逻辑计划中的每个算子拥有相应的1个或多个运算符,生成物理查询计划是基于不同的策略选择合适的运算符进行运算。当中,关系扫描运算符为叶子节点,其它运算符为内部节点。
后记
开源的数据库代码中能够下载OceanBase
或者RedBase
。OceanBase
是淘宝的开源数据库,RedBase是斯坦福大学数据库系统实现课程的一个开源项目。后面这两个项目都是较近開始的项目,代码量较少,结构较清晰,相对简单易读,在github上都能找到。可是OceanBase眼下SQL解析部分也没有所有完毕,仅仅有DML部分完毕;RedBase设计更简单,只是没有设计逻辑计划。
本文中就是參考了RedBase的方式进行解析。
參考文献:
《数据库系统实现》
《flex与bison》
欢迎光临--------。
假设阅读本文过程中有不论什么问题,请,转载请注明出处!