谈一谈SQL Server中的执行计划缓存(上)

2022-10-14 00:00:00 查询 语句 执行 缓存 计划

简介

    我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径。当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse)、绑定(Bind)、查询优化(Optimization,有时候也被称为简化)、执行(Execution)。除去执行步骤外,前三个步骤之后就生成了执行计划,也就是SQL Server按照该计划获取物理数据方式,后执行步骤按照执行计划执行查询从而获得结果。但查询优化器不是本篇的重点,本篇文章主要讲述查询优化器在生成执行计划之后,缓存执行计划的相关机制以及常见问题。

 

为什么需要执行计划缓存

    从简介中我们知道,生成执行计划的过程步骤所占的比例众多,会消耗掉各CPU和内存资源。而实际上,查询优化器生成执行计划要做更多的工作,大概分为3部分:

  • 首先,根据传入的查询语句文本,解析表名称、存储过程名称、视图名称等。然后基于逻辑数据操作生成代表查询文本的树。
  • 第二步是优化和简化,比如说将子查询转换成对等的连接、优先应用过滤条件、删除不必要的连接(比如说有索引,可能不需要引用原表)等。
  • 第三步根据数据库中的统计信息,进行基于成本(Cost-based)的评估。

 

    上面三个步骤完成之后,才会生成多个候选执行计划。虽然我们的SQL语句逻辑上只有一个,但是符合这个逻辑顺序的物理获取数据的顺序却可以有多条,打个比方,你希望从北京到上海,即可以做高铁,也可以做飞机,但从北京到上海这个描述是逻辑描述,具体怎么实现路径有多条。那让我们再看一个SQL Server中的举例,比如代码清单1中的查询。

   1: SELECT * 
   2: FROM A INNER JOIN B ON a.a=b.b
   3: INNER JOIN C ON c.c=a.a

相关文章