与 SSMS 相比,通过 Entity Framework 调用时,存储过程使用不同的索引执行

Stored procedure is executing with different indexes when called via Entity Framework compared to SSMS

我们有一个通过 sp_executesql.

执行动态 sql 的存储过程

我们通过 SQL 服务器分析器观察并查看执行计划,分析器显示当通过 SSMS(SQL Server Management Studio)调用此过程时,它使用了很好的组合索引,因此在 2 秒内返回。

另一方面,当我们通过 .NET 应用程序调用此过程(通过 Entity Framework 调用)时 - 与 SSMS 中的调用相比使用完全相同的参数 - 然后 SQL服务器使用更糟糕的索引选择。

而且这种行为是确定性的。通过我们的应用程序调用 - 错误索引。通过 SSMS 调用 - 良好的索引。

有人知道为什么会这样吗?

非常感谢。

更新:

存储过程调用如下所示: EXEC [schema].[sp] @a=123,@b=NULL

程序里面的动态SQL是这样执行的:

   `EXEC sp_executesql
    @sql,
    N'@a int, @b smallint',
    @a = @a,
    @b = @b`

我找到了答案:我将两个重点放在 entity framework 上,但是当我扩大搜索范围时,我找到了关于 ADO.NET 使用不同的连接设置的答案,因此使用了不同的执行计划: Why is some sql query much slower when used with SqlCommand?