SQL Server执行计划缓存中plan_handle不一致问题咨询
SQL Server执行计划缓存问题解答
场景1:WHERE子句参数不同导致plan_handle不同但哈希值一致
你的预期存在偏差,具体原因如下:
plan_handle是SQL Server缓存中执行计划的唯一标识,它的生成依赖于查询文本的精确匹配以及执行环境的一致性。如果你的两条查询是硬编码不同参数值(比如WHERE Country = 'AR'和WHERE Country = 'BR'),而非使用参数化查询(如sp_executesql或声明变量传入参数),SQL Server会将它们视为两条不同的查询语句,因此生成不同的plan_handle。query_hash和query_plan_hash一致,说明这两条查询的逻辑结构和最终生成的执行计划完全等价。这两个哈希值是基于查询的逻辑语义和执行计划的物理结构计算的,和硬编码的参数值无关。
要实现执行计划复用,你需要使用参数化查询,让SQL Server将不同的参数值视为同一查询的不同输入,而非不同的查询语句。
场景2:表名大小写不同导致plan_handle不同
这种情况的核心原因是查询文本的精确字符匹配规则:
- SQL Server对查询文本的匹配是逐字符精确匹配,即使数据库排序规则设置为大小写不敏感,查询文本中
Countries和countries的字符大小写差异,仍会被判定为不同的查询语句,因此生成不同的plan_handle。 - 如果数据库排序规则是区分大小写的(如
SQL_Latin1_General_CP1_CS_AS),Countries和countries会被视为两个完全不同的数据库对象,此时不仅plan_handle不同,执行计划本身也可能存在差异。
附查询缓存内容的T-SQL脚本
SELECT plan_handle, query_hash, query_plan_hash, TEXT AS query_text, query_plan FROM sys.dm_exec_query_stats CROSS APPLY sys.dm_exec_sql_text(plan_handle) CROSS APPLY sys.dm_exec_query_plan(plan_handle) WHERE TEXT LIKE '%你的目标查询特征%'
内容的提问来源于stack exchange,提问作者DSD
相关产品推荐
相关产品推荐

