Spark SQL入门与数据分析实践
上QQ阅读APP看书,第一时间看更新

1.4.1 传统SQL的运行原理

传统SQL语句一般由select、from数据源以及where限制条件组成,对应的这3部分在SQL语句中有专门的名称,如图1-2所示。

图1-2 SQL语句解析

例如,图1-2中的SQL语句在进行逻辑解析时会划分为3个模块,分别是投影(Projection)、数据源(DataSource)及过滤(Filter)模块。

SQL语句没有专门考虑聚合、排序等操作。

下面分别对这3个模块进行解释。

1.投影

投影表示将数据源中的字段做映射或操作形成新的字段及值。

2.数据源

数据源表示数据的来源,在SQL中通常为某张表或某个子查询的结果。

3.过滤

数据源中的数据可以通过各种过滤条件进行筛选。

对于上述3个模块,当SQL语句生成执行部分时,它们又称为结果集(Result)、数据源(DataSource)和操作(Operation)模块。

在关系数据库中,执行一个SQL查询语句的过程如图1-3所示。

图1-2 执行一个SQL查询语句的过程

输入SQL查询语句(Query)时,SQL的查询引擎会首先对该查询语句进行解析,也就是将SQL中投影、数据源和过滤这3个模块解析出来形成一棵逻辑解析树(Tree),这个过程称为Parse(解析)过程。当然在解析过程中会对SQL语句进行语法检查,看是否有错误,如是否缺少投影字段、数据源是否存在等。一旦发现语法错误,将停止解析并报错。当完成解析后,则会进入Bind(绑定)过程。

Bind过程是一个绑定的过程。它采用的策略是先将SQL查询语句分割成不同的部分,再解析形成逻辑解析树,之后将数据源的数据表位置、需要的字段、执行的逻辑这些信息都保存在数据库的数据字典中。所以Bind过程实质上把Parse过程形成的逻辑解析树与数据库的数据字典进行绑定的过程。Bind过程完成后会形成一棵可执行的树,能够让程序知道表在哪、需要什么字段等信息。

Bind过程完成后,数据库查询引擎会根据信息形成多个查询执行计划及每个查询执行计划的相关统计信息。查询执行计划虽然有多个,但是并不是每个都是最优的,所以数据库会根据这些查询执行计划的统计信息选择一个最优的查询执行计划,而该过程称为优化(Optimize)过程。

当经过上面的优化过程后,将进行执行(Execute)过程。该过程首先会执行操作模块,即where条件部分;然后找到数据源对应的数据表;最终形成结果集,即select模块。所以执行过程和解析过程的顺序并不同,是Operation->DataSource->Result。