所以这就是场景:
表有很多字段。 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没有用,所以这不是兑现查询计划的问题。
问题是,为什么差异?
谢谢。
编辑:意外地将相同的内容放入第二个查询中,更新以正确反映它。
答案 0 :(得分:0)
这是由于参数是可变的,如果您硬编码它将返回到相同的计划,或者如果您将参数放入正常执行中,它将生成扫描计划。