当查询语句提交到SQL服务器时,它会经历几个处理步骤。
第1步:解析 (parsing)
这是查询执行的第一步。 这涉及语法检查。 违反SQL语法规则的语句无法通过检查。 此步骤的输出是解析树 parse tree。
解析 (parsing)
第2步:绑定 (binding)
Algebrizer将解析后的树作为输入进行绑定。Algebrizer执行语义检查以确定语句是否有意义,例如,语句中的对象和列是否存在。Algebrizer还识别正在为给定查询处理的所有数据类型。 在此步骤之后,当实际执行命令时,该语句不再以源格式提供。Algebrizer生成一个查询进程树,用作查询优化器的输入。
绑定 (binding)
第三步:查询优化 (QueryOptimization)
查询优化是编译的最后一步。 无法优化的语句,例如控制流和数据定义语言(DDL)命令,被编译成内部形式。 可优化的语句被标记,然后传递给查询优化器。 查询优化器的工作是获取从algebrizer输出的查询树,并找到一种“好的”方法来检索所需的数据(结果)。SQL Server使用成本是基于优化器计算的。 成本主要是通过考虑每个备选方案必须读取的数据大小来计算的。 为了计算出这些成本,SQLServer需要知道每个表的大小和列值的分布,这可以从与数据相关的统计信息中获得。 优化器的输出是查询执行计划 (execution plan)。
第4步:查询执行
这是查询处理的最后一步。 在处理需要来自基表的数据的步骤时,关系引擎请求存储引擎从关系引擎请求的行集中传递数据。
Flow