SQL Server执行逻辑查询时,SQL被解析的步骤

时间:2022-01-03 03:39:40

以下这段对SQL Server执行逻辑查询时,SQL被解析的步骤。摘自《SQL Server 2005技术内幕 T-SQL查询》。这是一本非常好的讲解SQL Server的书,整个SQL Server 2005技术内幕系列都是,个人强烈推荐。

 

我一直认为,学好任何一种技术,没有什么比学好它的基础知识和底层原理更重要。如果你相信有“捷径”,那么这就是唯一的“捷径”。了解这些,有助于你更快地掌握技术最本质的核心。

我真希望早点看到那些好书,也希望看到这篇文章的你,能有点收获,多读好书,少走一些弯路。

 

他山之石可以攻玉!

 SQL Server执行逻辑查询时,SQL被解析的步骤

以上步骤从1-11按顺序被执行,如果没有将跳过相应步骤;

以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表仅用于查询器内部使用,对调用者或外部查询不可用,只有最后一步生成的表才会返回给调用者。

 

逻辑查询处理阶段:

1.       From:对From子句中的前两个表(left_tableright_table)执行笛卡尔积[交叉联结],生成虚拟表VT1.

2.       On:VT1应用On筛选器,只有那些使<join_condition>为真的行才被插入VT2

3.       Outer(Join):如果指定了OUTER Join(相对于Cross JoinInner Join),保留表中未找到匹配的行将作为外部行添加到VT2,生成T3。如果From子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。

4.       Where:对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子句中的列列表排序,生成一个游标(VT10)

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