SQL Server中,查询处理是由关系引擎执行的。处理的过程是将你写的T-SQL语句转换成能发送请求给存储引擎并能获取所需结果的东西。SQL Server采取4步来处理一个查询:parsing、algebrizing、optimizing和execution,如图5-1所示。前3步都是由关系引擎执行的。第三步的输出结果是优化的计划,这个计划会被调度,在调度期间,会呼叫存储引擎来获取数据,即查询的执行结果。
语法分析(Parsing)
在语法分析阶段,SQL Server对源码(T-SQL batch)执行基本的检查。这个语法分析寻找无效的SQL语法,如错误使用关键字(reserved words)、列名和表名等。如果语法分析无误完成,它会生成一个解析树(parse tree),并传递给查询处理的下一阶段绑定。解析树是查询的内部表示。如果解析发现任何错误,处理就会停止并返回错误信息。
Algebrizing
Algebrization阶段也被称为绑定阶段,SQL Server的早期版本把这个阶段称为标准化(normalization)。在algebrizing期间,SQL Server对解析树执行几个操作,然后生成一个查询树传递给查询优化器。在algebrizing期间,SQL Server遵循如下模式的执行步骤:
- 第一步:名称解析----确认所有的对象都在用户的安全上下文中存在并可见。这里会检查表名和列名,以确保它们都存在,并且用户有权访问它们。
- 第二步:类型派生(derivation)----确定解析树的每个节点的最终类型。
- 第三步:聚集绑定(Aggregate binding)----确定在哪里做聚集。
- 第四步:群组绑定(Group binding)----把聚集绑定到合适的选择列表。
语法错误是在这个阶段发现的。如果遇到语法错误,优化处理会停止并将错误返回给用户。