专题一 SQL真正的执行顺序
1. SQL的语法顺序
语法顺序,即
- FROM:指定要查询的数据源表
- JOIN 和 ON:对FROM子句中的表进行,并应用ON子句中的连接条件。
- WHERE:设置筛选条件,
- GROUP BY:将查询结果按指定字段进行
- HAVING:对分组后的结果进行筛选(如果需要)
- ORDER BY:对查询结果进行排序
- LIMIT:对查询结果取前n行
2. 逻辑执行顺序
是什么
逻辑执行顺序是指SQL查询语句在逻辑上被解析和执行的顺序,它反映了查询语句的结构和语义。
逻辑执行顺序通常遵循以下步骤:
- FROM:确定查询的数据源表,并生成一个虚拟表作为后续操作的基础。
- JOIN 和 ON:对FROM子句中的表进行连接操作,并应用ON子句中的连接条件。
- WHERE:对连接后的结果进行筛选,只保留满足WHERE条件的记录。
- GROUP BY:将筛选后的记录按GROUP BY子句中的字段进行分组。
- HAVING:对分组后的结果进行进一步筛选,只保留满足HAVING条件的分组。
- SELECT:选择SELECT子句中指定的字段或列,并生成最终的查询结果。
- DISTINCT:如果SELECT子句中包含DISTINCT关键字,则对查询结果进行去重处理。
- ORDER BY:对查询结果进行排序,按ORDER BY子句中的字段或列的顺序返回结果。
- LIMIT:对查询结果取前n行
其实记忆的方式也很简单,相比于SQL的语法顺序,逻辑执行顺序主要是将SELECT的执行顺序靠后,放到了HAVING之后,其他的相对顺序都是没有变化的!
3. 物理执行顺序
首先,先搞清楚【逻辑执行顺序】和【物理执行顺序】的区别:
区别是什么
逻辑执行计划:是对查询语句的抽象表示,它描述了查询的语义和逻辑结构,如表连接、过滤条件、分组、排序等。逻辑执行计划并不涉及具体的执行细节,如数据的存储方式、数据的分区情况等。
物理执行计划:则是根据逻辑执行计划和具体的执行环境(如数据的存储方式、集群的配置等)生成的,它包含了查询执行的具体细节,如数据的读取方式、数据的处理方式(如过滤、连接、排序等)以及数据的输出方式等。
一般来说,先有逻辑执行计划,再生成具体的物理执行计划。
物理执行计划,会改变哪些SQL操作的执行顺序?
对于不同的执行引擎而言,物理执行计划是不同的,下面以SparkSQL为例进行说明。
最经典的就是:过滤条件的下推
为了减少不必要的数据读取和处理量,SparkSQL会将外部的过滤条件尽可能地下推到子查询或数据源读取阶段。
这种优化操作能够显著减少数据在后续处理阶段的传输和处理量,从而提高查询的执行效率。 也就是将 WHERE 操作提前