下面,给大家看一个逻辑树的例子,对于下面的查询:
产生的逻辑树如下:
这个过程就是编译原理的一个文法词法的解析。
谈完了Parsing,之后的操作就是Binding了,这个操作现在改名字为Algebrizer。这个操作主要就是检查解析产生的逻辑树中的对象是否存在,例如Customer是否是数据库中的表,CustomerID字段是否在Customer表中等。
经过了这个Binding之后,就会产生另外一个树形的数据结构,传递给下一个步骤。
2、查询优化。这个过程主要是使用上述过程中的Algebrizer Tree进行优化的处理过程,我们这里大体的可以将这个优化的处理过程分为两个步骤:
a)产生执行计划。在这个过程中,查询优化器会使用之前的树,产生执行计划。这个过程主要是将树上的逻辑操作转换为物理操作(其实就是存储引擎可以调用的方法,这些方法就是实实在在的去读取数据的)。
b)估算每个执行计划的成本。一个逻辑操作可以有很多的物理操作与其对应,而每个物理操作的成本不一样,同时,也没用所谓的“什么物理操作比其他的物理操作更优” ,一切视情况可认定。在这个过程中产生很多的候选执行计划,并且查询优化器会综合考虑很多的情况,选择一个它认为“比较优”的计划,传递给存储引擎。
3、查询的执行与计划的缓存。这个过程比较简单了,主要是存储引擎去执行执行计划,同时为了避免相类似的SQL查询重新编译,使用过的执行计划会被缓存在计划缓存池中。
基本是,我们可以看出,查询优化的过程就是一个将逻辑操作映射为物理操作的过程。
我们在下一篇中稍微深入的看看候选执行计划的产生以及估算它们的成本!《SQL Server查询优化器:最佳执行计划》