当一个查询被提交时,发生了什么?

向SQL Server提交一个查询时,sever上的许多进程会在这个查询上开始工作。 这些进程的目标就是管理这个系统,使得这个查询可以选择,插入,更新,删除数据。

每当向系统提交一个查询时,这些进程就会开始活动(kick into action)。 尽管在SQL Server中同时发生着许多不同的活动,但是我们将关注那些围绕着查询的进程。 用来满足查询要求的进程可以粗糙地分为两个阶段: 1.发生在关系引擎中的进程 2.发生在存储引擎中的进程

在关系引擎中,查询从语法上被解析,然后被用于生成执行计划的查询优化器处理。 这个计划会以二进制的形式发送到存储引擎,它会以执行计划为基础获取或修改底层数据(underlying data)。 存储引擎就是诸如锁、索引维护、事务等发生的地方。 既然执行计划是在关系引擎中被创建的,那么关系引擎就是我们主要关注的地方。

查询语法分析 当我们把查询交给SQL Server系统的时候,它到达的第一个地方就是关系引擎。 当查询到达时,会把它交给一个进程来检查T-SQL是否正确,格式是否对。 这个进程就是查询语法分析进程(Query Parsing)。 如果查询不能够正确解析,比如你把Select写成了Seletc,那个解析就会停止并返回一个错误给查询源。 语法解析进程的输出是一个语法树(parse tree)或者查询树(query tree),它甚至可以叫做序列树(sequence tree)。 这个语法树表示的是执行查询请求所必须的逻辑步骤。

如果T-SQL文(string)不是数据操作语言(DML)声明,而是数据定义语言(DDL)查询,那么它将不会被优化。 一个原因就是对于SQL Server来讲创建一个表这种操作只有唯一的正确的方法。 因此就没有机会为这个语句提高性能。