为什么使用ado.net / EF 6执行存储过程需要这么长时间?

时间:2018-10-26 09:04:40

标签: sql-server ado.net entity-framework-6 azure-sql-database query-performance

环境:

  • ASP.NET MVC 5.2.3.0
  • SQL Server 2014(v12.0.2000.8)
  • 实体框架6

托管在Azure上

我们有一页使用存储过程从数据库中获取数据。

最近我们注意到,该页面有时加载约20秒。因此,我们开始调查问题。我试图直接从Management Studio执行此存储过程,它花费了150毫秒以上的时间:

enter image description here

所以接下来要做的是创建一个控制台应用程序,该应用程序连接到Azure SQL数据库并执行此存储过程:

enter image description here

我还尝试使用EF 6中的SqlQuery

enter image description here

同一件事。

重要的事情:这不是永久性的问题。有时会出现此问题,有时会很好-50/50。

我已经检查了Azure门户中的数据库负载-大约50%的DTU使用率(在此性能问题期间)。但是我认为这与数据库负载无关,因为它可以从Management Studio快速执行。

目前我不知道出了什么问题,所以我需要帮助。我想注意到很多员工一直在使用该页面(执行存储过程)。也许这与问题有关。

那么问题:为什么使用ado.net / EF执行此存储过程需要这么长时间?

1 个答案:

答案 0 :(得分:0)

进行一些调试。

潜在的罪魁祸首主要包括:

  • 没有快速释放的数据库侧锁定,使SP处于等待状态。
  • 参数嗅探,其中查询路径对于一组特定的参数不是最佳的(这可能会导致锁定阻止您)。这是一个SP问题-有人针对此类情况编写的SQL不正确。

您提供的信息无关紧要。请参阅... SP在EF6中未执行-EF6将它们添加到ADO.NET中,ADO.NET将其发送到数据库。正如您所说的那样,它们在数据库中的运行速度很慢,对于这个特定问题,任何C#级别的调试都没有像我本地Pizzeria的菜单一样有用。您必须停止调试并分析数据库中发生的情况。

您提供的SSMS屏幕截图完全没有用-如果发生这种情况,您需要在SSMS中运行SP,然后使用...查询计划和适当的nalaysis跟踪以查看会发生什么。