执行计划的编译和生成是很耗费资源和时间的,因此,SQL Server会把生成的任一执行计划缓存起来,以便重用。
一,缓存机制SQL Server使用特定的缓存机制,以重用之前已经生成的执行计划:
Ad hoc 查询缓存
参数化Ad Hoc查询缓存
sys.sp_executesql 执行的查询,是一种参数化的查询语句
存储过程
前两种机制是SQL Server自动进行的,用户不能干预,而后两种是用户可以干预的。
1,Ad Hoc查询缓存
对于任意一个Ad Hoc查询,SQL Server都会把它的执行计划缓存,只有当该批处理语句完全匹配该查询时,才会复用已缓存的执行计划。
SQL Server根据批处理语句的文本计算出一个Hash值,对后续的Ad Hoc查询的文本有计算Hash值,当两个Hash值相同时,说明两个批处理的文本完全一直,是同一个查询,SQL Server优化器会复用已缓存的执行计划,如果Ad Hoc查询的文本有任意一个字符变化(比如,大写变小写,不同的换行),都会导致计算出的Hash值不同,进而不能复用执行计划。也就是说,Ad Hoc必须完全匹配才能复用。
2,参数化Ad-Hoc
SQL Server 自主决定是否把查询中的常量作为参数来对待,除了常量不同之外,其他语句都相同,这就是一个查询语句的模板,不同的参数使用相同的执行计划。例如,对于以下两个查询语句,除了常量1和2不同之外,其他语句都相同,
select ID, Name from dbo.Users where ID=1 select ID, Name from dbo.Users where ID=2