自己实现一个SQL解析引擎(四)

2014-11-24 15:28:21 · 作者: · 浏览: 4
调用序列来确定。程序只需要1个缓冲区就可以向用户返回结果集。

也有些情况需要等待所有结果返回才进行下一步运算的,比如Sort , Dist运算,需要将整个结果集排好序后才能返回,这种情况称作物化,物化操作通常是在open函数中完成的。

一个完整的例子

接下来以一个例子为例表示各部分的结构,SQL命令:

SELECT t1.a,t2.b FROM t1,t2 WHERE t1.a = t2.a AND t2.b = '1990';

其对应的分析树为:

\

图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》


欢迎光临我的网站----蝴蝶忽然的博客园----人既无名的专栏。

如果阅读本文过程中有任何问题,请联系作者,转载请注明出处!