首页 > 解决方案 > SQL Server EF Core 行删除性能

问题描述

我有一个简单的 3 列表来跟踪待处理的计算。第一列是链接到客户表的整数外键。第二个是日期,第三个是优先级标志。表的主键是客户端 FK 和日期的组合。

该表用于计算队列,因此它看到了很多流失。然而,我注意到的是,使用这个表本身有时比它作为队列的实际计算要慢。具体来说,当它有大约 1000 行并且计算短路时,从队列中仅删除一行并调用 SaveChanges 平均需要 3 秒。

随着这张桌子不断地被添加和移除,这三秒钟很快就加起来了。并且必须连续完成以确保以正确的顺序处理队列。删除三列表中的单行似乎需要非常长的时间。

我猜复合键是罪魁祸首......?但我不确定,而且我是 MS SQL 和 EF Core 的新手。谁能指出我正确的方向来分析这个以确定瓶颈?

标签: sql-serverentity-frameworkdatabase-performance

解决方案


我将首先通过 Visual Studio ( Debug > Performance Profiler) 分析应用程序,以查看问题实际出在哪里:

  1. 如果您发现对 SQL 的调用实际上很慢,我将继续检查哪些命令实际发送到 SQL 服务器以及哪些命令需要这么长时间。使用ExpressProfilerAzure Data StudioSQL Server Profiler 扩展或 SQL Server Management Studio。这也可能导致 SQL 性能不佳,因为忽略了维护,例如碎片索引等。
  2. 您可能还会发现问题实际上出在 EF 逻辑中,例如,更改跟踪器试图找出要更新的实体。在这种情况下,您将需要找到一种方法来避免特定问题(例如,每次删除后不要保存,使用 SQL 命令手动删除行,使用 Dapper 而不是 EF 等)。

我希望这些想法可以帮助您解决问题。祝你好运 ;-)


推荐阅读