数据库的语句执行顺序(必看)

来源:互联网 发布:云计算架构师要求 编辑:程序博客网 时间:2024/05/21 06:16


Author:王勤为

1.问题:如下2条语句的具体执行顺序是什么呢,有什么区别,哪条语句效率更高?

   (1).select * from tb1 a join tb2 b on a.id=b.id
              where a.time between t11 and t12 and b.time between t21 and t22

   (2).select * from (select * from tb1 where time between t11 and t12) a
             join (select * from tb2 where time between t21 and t22) b on a.id=b.id 

2.答案:有区别,第二条是先筛选后连接,在数据量很大而且没有索引的情况下,第二条语句的效率更高,如果有索引,请查看具体执行计划再做决定。

3.具体请看一个完整的SQL语句是怎么执行的吧
执行顺序:

(1). FROM:对FROM子句中的前两个表执行笛卡尔积,生成虚拟表VT1。

(2). ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。

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

如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到

处理完所有的表为止。

(4). 对VT3应用WHERE筛选器。只有使<where_condition>为TRUE的行才被插入VT4。

(5). GROUP BY:按GROUP BY 子句中的列列表对VT4中的行分组,生成VT5。

(6). CUBE|ROLLUP:把超组插入VT5,生成VT6。

(7). HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为TRUE的组才会被插入VT7。

(8). SELECT:处理SELECT列表,产生VT8。

(9). DISTINCT:将重复的行从VT8中移除,产生VT9。

(10). ORDER BY:将VT9中的行按ORDER BY子句中的列列表排序,生成一个有表(VC10)。

(11). TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。
 
0 0