sp_execute选择不同的查询计划

时间:2016-08-23 08:35:33

标签: sql-server performance sql-execution-plan

所以这就是场景:

表有很多字段。 Field2是聚簇索引中唯一的字段。 存在Field1,Field2唯一索引,不包含任何其他字段。

表有500000行,其中499900具有Field1的空值。

查询1:

SELECT TOP (1) * 
FROM Table WITH(UPDLOCK) 
WHERE (Field1='XXX') ORDER BY Field1 DESC, Field2 DESC OPTION(OPTIMIZE FOR UNKNOWN)

生成索引寻找唯一索引Field1,Field2,然后键查找到聚簇索引,并且非常快。

然而,

Declare @P1 int;  
Exec sp_prepare @P1 output,   
N'@0 nvarchar(20)',  
N'SELECT TOP (1) * 
FROM Table WITH(UPDLOCK) 
WHERE (Field1=@0) ORDER BY Field1 DESC, Field2 DESC OPTION(OPTIMIZE FOR UNKNOWN)';  
Exec sp_execute @P1, N'XXX'
EXEC sp_unprepare @P1;  

生成聚簇索引扫描,速度很慢。

DBCC FREEPROCCACHE没有用,所以这不是兑现查询计划的问题。

问题是,为什么差异?

谢谢。

编辑:意外地将相同的内容放入第二个查询中,更新以正确反映它。

1 个答案:

答案 0 :(得分:0)

这是由于参数是可变的,如果您硬编码它将返回到相同的计划,或者如果您将参数放入正常执行中,它将生成扫描计划。