declare @name varchar(156)
set @name ='sara'
--Query 1:
SELECT [PNAME] FROM [tbltest] where [PNAME] like '%'+@name+'%'
--Query 2:
SELECT [PNAME] FROM [tbltest] where [PNAME] like '%sara%'
假设在 [tbltest] 的 [PNAME] 列上有一个 NoneClustered Index。 运行查询时,执行计划显示索引 Seek For Query 1 和 Index Scan for Query 2。 我预计 Excution Paln 会为这两个查询显示索引扫描,但由于在第一个查询中使用参数,它会显示索引查找。 那我到底是什么? 在这两个查询中,我们都在另一边使用了“%”,并且知道在这种状态下,sql 不考虑索引 但为什么在第一个 Query Execution Plan Show Index Seek 中? 谢谢
最佳答案
查询一使用一个参数,查询二一个常量。
如果更改常量值,查询 2 的计划将不会被重用。
查询plan 1即可。在这种情况下,SQL Server(简单地)保留它的选项以重用该计划。
又名:查询不相同。
如果你force parameterisation ,那么你应该让两个查询都像查询 1 一样运行。但我还没有尝试过......
关于SQL 执行计划显示相同输入的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3228315/