CDA117526

2022-02-03   阅读量: 372

Mysql

SQL优化之执行顺序

扫码加入数据分析学习群

SQL优化之执行顺序 总结


FROM 才是 SQL 语句执行的第一步,并非 SELECT 。对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1,获取不同数据源的数据集。FROM子句执行顺序为从后往前、从右到左,FROM 子句中写在最后的表(基础表 driving table)将被最先处理,即最后的表为驱动表,当FROM 子句中包含多个表的情况下,我们需要选择数据最少的表作为基础表。

2 ON 应用ON过滤器


如果指定了OUTER JOIN保留表中未找到匹配的行将作为外部行添加到虚拟表 VT2,生成虚拟表 VT3。保留表如下:

RIGHT OUTER JOIN 把右表记为保留表

在虚拟表 VT2表的基础上添加保留表中被过滤条件过滤掉的数据,非保留表中的数据被赋予NULL值,最后生成虚拟表 VT3。

4 WHERE 应用WEHRE过滤器

由于数据还没有分组,因此现在还不能在WHERE过滤器中使用聚合函数对分组统计的过滤。同时,由于还没有进行列的选取操作,因此在SELECT中使用列的别名也是不被允许的。


按GROUP BY子句中的列/列表将虚拟表 VT4中的行唯一的值组合成为一组,生成虚拟表VT5。如果应用了GROUP BY,那么后面的所有步骤都只能得到的虚拟表VT5的列或者是聚合函数(count、sum、avg等)。原因在于最终的结果集中只为每个组包含一行。


计算 max 等聚合函数。SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。常用的 Aggregate 函数包含以下几种:

COUNT:返回行数

LAST:返回最后一个记录的值

MIN:返回最小值


对虚拟表 VT5应用ROLLUP或CUBE选项,生成虚拟表 VT6。

CUBE 生成的结果数据集显示了所选列中值的所有组合的聚合。


对虚拟表VT6应用HAVING筛选器。根据指定的条件对数据进行筛选,并把满足的数据插入虚拟表VT7。


将虚拟表 VT7中的在SELECT中出现的列筛选出来,并对字段进行处理,计算SELECT子句中的表达式,产生虚拟表 VT8。

10 DISTINCT 行去重


将虚拟表 VT9中的行按ORDER BY 子句中的列/列表排序,生成游标 VC10 ,注意不是虚拟表。因此使用 ORDER BY 子句查询不能应用于表达式。同时,ORDER BY子句的执行顺序为从左到右排序,是非常消耗资源的。

12 LIMIT/OFFSET 指定返回行

<p helvetica="" neue",="" "pingfang="" sc",="" "hiragino="" sans="" gb",="" "microsoft="" yahei="" ui",="" yahei",="" arial,="" sans-serif;="" letter-spacing:="" 0.544px;="" text-align:="" justify;="" white-space:="" normal;="" background-color:="" rgb(255,="" 255,="" 255);="" box-sizing:="" border-box="" !important;="" overflow-wrap:="" break-word="" !important;"="" style="padding: 0px; margin-top: 0px; margin-bottom: 0px; list-style: none; box-sizing: border-box; outline: 0px; max-width: 100%; clear: both; min-height: 1em; color: rgb(62, 62, 62);">从VC10的开始处选择指定数量行,生成虚拟表 VT11,并返回调用者。


添加CDA认证专家【维克多阿涛】,微信号:【cdashijiazhuang】,提供数据分析指导及CDA考试秘籍。已助千人通过CDA数字化人才认证。欢迎交流,共同成长!
32.6526 7 0 关注作者 收藏

评论(0)


暂无数据

推荐课程