下定了很大决心,终于决定写一个专栏。某种意义上来讲,这也是一种立flag,倒逼自己的行为。最后有没有打脸暂且不论,开个头总是好的。
决定以calcite作为对象,是因为目前工作主要接触到就是它。作为Olap引擎中sql解析和优化的事实标准,caclite有其独特的优势。我个人理解,主要是以下几点:
虽然calcite本身体量不大,但是麻雀虽小,五脏俱全。要彻底搞清楚其中的方方面面,实非易事。所以后面将从sql优化领域涉及到的各个要点,逐个击破。具体手段将会是,借助test case进行源码跟读,深入细节。其间有豁然开朗处,总结成文,以飨观众。
为了内容有一定组织性,不至于信马由缰,不知所云,下面列出目前能够想到的一些主题,以此作为提纲挈领之作用。
calcite是什么东西?能解决什么问题?解决这些问题的理论基础是什么?
弄清楚这些才能更好理解后面章节的内容。
sql作为大数据领域生产和查询的主流DSL,生命力旺盛而强大。那么,如何从一段sql文本解析为可解释的程序对象呢?javacc是calcite选择的答案。
按照SQL标准解析完成的ast充满着不确定性,它只满足词法,但不完全满足语法。validator正是用来补齐这一环。
关系代数RelNode是参照关系代数理论进行设计的模型,相比于SqlNode纯词法解析的产物,拥有更多的属性和理论加持。calcite的核心就是RelNode,后续的所有优化规则、代价计算也都将基于RelNode进行。
依赖于关系代数的理论基础,relNode本身是可以进行一些等价变换的。逻辑上来看,区别并不大,但是对实际执行的效果来看,确是天差地别。
在长期的实践中,专家们发现某些特定的转换可以带来sql执行性能的提升,于是就将其总结了出来,在calcite的落地中,称为规则。比如FilterPushDown,谓词下推。
但往往,规则是武断的。最终,还得要数据说话。CBO是另外一种优化的思路。在CBO的框架下,对于某一类变形转换,需要计算出实际的执行代价,择优选用。相对来说,更为科学。
正如前言,麻雀虽小,五脏俱全。除了优化体系,具体如何执行,calcite也提供了一套执行框架,并且支持jdbc标准。
加速SQL执行的另一种思路,是以空间换时间。在大数据领域中,这个所谓“空间”的另一种叫法是物化视图。其思路是,对查询逻辑中的某一段热点进行提前计算,那么sql则可以把原本面向大数据量的结果集,替换成这一段已经提前计算好的结果集,以此减少计算量,打到提速的效果。
大概应该就这些大的主题吧。如果在框架内部发现一些有意思的实现,后面也会单独拎出来唠唠。