什么是查询引擎
可以把他理解成一个网关,对于数据库来说它叫查询引擎,对于对象存储来说,它就是一个rgw(ceph),作用都是将用户的查询语句转化成存储引擎能处理的调用;
datafusion
不同的数据库实现了不同细节的查询引擎,但是大致相似,正因此,出现了datafusion,旨在统一查询引擎,减少重复造轮子,我们以datafusion做基础来介绍sql查询引擎需要哪些能力,如果对细节有兴趣可以看duckdb的实现,非常完美和标准化;
语法解析
简单的关键词匹配,将其转换成抽象语法树,比如select * from table1;
匹配到第一个单词是select,那么产生一个扫表(scan table)的节点,这个节点的参数是:projection: *, table_name: table1,
注:projection就是投影,可理解为在一个大集中取子集就是投影;
这是一个简单的查询语句,产生只有一个节点的抽象语法树
创建逻辑计划
所以逻辑计划,可以理解为一个接口,这个计划规定要做什么,但是不规定怎么做
语义解析
刚刚的语法解析只是简单的关键字匹配,然后生成的逻辑计划,但是对于同一个关键字,在不同的语义下可以产生不同的逻辑计划,比如,projection中是否含有索引,如果有那就生产基于索引的扫表,如果没有,就产生全量的扫表,二者的实现会不一样,
逻辑计划优化
根据制定的优化规则进行优化,最常见的就是谓词下推,让计算更靠近数据源,减少数据的传输;
创建物理计划
物理计划就是逻辑计划的具体实现,比如一个扫表操作,逻辑计划只是指明扫表这个目的,那么物理计划就是扫表的具体细节,比如:任务应该发送到哪个存储节点,limit,projection,谓词处理这些