所以这是场景:sp_execute选择不同的查询计划
表中有许多字段。 Field2是聚簇索引中唯一的字段。 存在不包含任何其他字段的Field1,Field2唯一索引。
表中有500000行,其中499900个字段为空值。
查询1:
SELECT TOP (1) *
FROM Table WITH(UPDLOCK)
WHERE (Field1='XXX') ORDER BY Field1 DESC, Field2 DESC OPTION(OPTIMIZE FOR UNKNOWN)
可生产索引查找唯一索引字段1,字段2,然后键查找到聚集索引,并且是非常快的。
然而,
Declare @P1 int;
Exec sp_prepare @P1 output,
N'@0 nvarchar(20)',
N'SELECT TOP (1) *
FROM Table WITH(UPDLOCK)
WHERE ([email protected]) ORDER BY Field1 DESC, Field2 DESC OPTION(OPTIMIZE FOR UNKNOWN)';
Exec sp_execute @P1, N'XXX'
EXEC sp_unprepare @P1;
产生一个簇索引扫描,这是缓慢的。
DBCC FREEPROCCACHE没有帮助,所以它不是问题与兑现查询计划。
问题是,为什么区别?
谢谢。
编辑:意外地将同样的事情放入第二个查询中,更新以正确反映它。
我想知道如果将@ P1参数硬编码到命令字符串中会发生什么情况。那么执行时间是多少? – PacoDePaco
对参数进行硬编码使计划保持一致。 – mrQQ