我正在评估一些计划缓存行为,这是我的场景。
我分别运行以下两个查询:
SELECT TOP 10 *
FROM dbo.Countries CT
LEFT JOIN dbo.Continents CN ON CT.ContinentId=CN.ContinentId
WHERE CountryId='AR'
SELECT TOP 10 *
FROM dbo.Countries CT
LEFT JOIN dbo.Continents CN ON CT.ContinentId=CN.ContinentId
WHERE CountryId='BR'
运行两个查询后,我得到了这个计划缓存视图:
我的理解是:
问题:我真的不明白为什么每次执行都会得到不同的 plan_handle,即使查询基本相同,并且 query_hash 和 query_plan_hash 确实匹配。这可能是什么原因?
我明白声明中的差异,但我认为这不重要。否则,每个 sql_handle 总是有一个 plan_handle,因为它总是会改变。
已检查一些附加设置:
我检查了影响此行为的所有潜在属性,但没有运气。 我希望两个查询重用相同的计划,因此指向相同的 plan_handle。 难道我的期望不正确吗?
谢谢
我希望两个查询重用相同的计划,因此指向相同的 plan_handle。难道我的期望不正确吗?
您的期望是错误的。当您对 where 子句值进行硬编码时,文字值在计划优化时可用,因此不同的查询可能会得到不同的计划。
如果您没有在应用程序的设计中显式构建参数,您还可以依靠 SQL Server 查询优化器使用简单参数化的默认行为自动参数化某些查询。或者,您可以通过将 ALTER DATABASE 语句的 PARAMETERIZATION 选项设置为 FORCED,强制查询优化器考虑参数化数据库中的所有查询。