与 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?
我们有一个通过 sp_executesql
.
我们通过 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?