以下这段对SQL Server执行逻辑查询时,SQL被解析的步骤。摘自《SQL Server 2005技术内幕 T-SQL查询》。这是一本非常好的讲解SQL Server的书,整个SQL Server 2005技术内幕系列都是,个人强烈推荐。
我一直认为,学好任何一种技术,没有什么比学好它的基础知识和底层原理更重要。如果你相信有“捷径”,那么这就是唯一的“捷径”。了解这些,有助于你更快地掌握技术最本质的核心。
我真希望早点看到那些好书,也希望看到这篇文章的你,能有点收获,多读好书,少走一些弯路。
他山之石可以攻玉!
以上步骤从1-11按顺序被执行,如果没有将跳过相应步骤;
以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表仅用于查询器内部使用,对调用者或外部查询不可用,只有最后一步生成的表才会返回给调用者。
逻辑查询处理阶段:
1. From:对From子句中的前两个表(即left_table和right_table)执行笛卡尔积[交叉联结],生成虚拟表VT1.
2. On:对VT1应用On筛选器,只有那些使<join_condition>为真的行才被插入VT2
3. Outer(Join):如果指定了OUTER Join(相对于Cross Join或Inner 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,并返回给调用者。
原文发布时间为:2011-02-12
本文作者:vinoYang