SQL 服务器 EF 核心行删除性能
SQL Server EF Core Row Deletion Performance
我有一个简单的 3 列 table 来跟踪待处理的计算。第一列是链接到客户端 table 的整数外键。第二个是日期,第三个是优先级标志。 table 的主键是客户端 FK 和日期的组合。
这个table用于计算队列,所以它看到很多流失。然而,我注意到,使用这个 table 本身有时比它作为队列的实际计算要慢。具体来说,当它有大约 1000 行并且计算短路时,从队列中仅删除一行并调用 SaveChanges 平均需要三秒钟。
随着这个 table 的不断添加和删除,这三秒钟加起来很快。而且必须按顺序完成,以确保以正确的顺序处理队列。在三列 table.
上删除一行似乎花费了非常长的时间
我猜应该归咎于复合键...?但我不确定,而且我是 MS SQL 和 EF Core 的新手。任何人都可以指出正确的方向来对此进行分析以确定瓶颈吗?
我将从通过 Visual Studio (Debug > Performance Profiler
) 分析应用程序开始,看看问题到底出在哪里:
- 如果您发现对 SQL 的调用实际上很慢,我会继续检查实际上向 SQL 服务器发送了哪些命令以及哪些命令花费了这么长时间。使用 ExpressProfiler, SQL Server Profiler extension for Azure Data Studio 或 SQL Server Management Studio。这也可能导致 SQL 性能不佳,因为疏忽了维护,例如碎片化的索引等。
- 您可能还会发现问题实际上出在 EF 逻辑中的某处,例如,更改跟踪器试图找出要更新的实体。在这种情况下,您将需要找到一种方法来避免特定问题(例如,每次删除后不保存,使用 SQL 命令手动删除行,使用 Dapper 而不是 EF 等)。
希望这些想法能帮助您解决问题。祝你好运;-)
我有一个简单的 3 列 table 来跟踪待处理的计算。第一列是链接到客户端 table 的整数外键。第二个是日期,第三个是优先级标志。 table 的主键是客户端 FK 和日期的组合。
这个table用于计算队列,所以它看到很多流失。然而,我注意到,使用这个 table 本身有时比它作为队列的实际计算要慢。具体来说,当它有大约 1000 行并且计算短路时,从队列中仅删除一行并调用 SaveChanges 平均需要三秒钟。
随着这个 table 的不断添加和删除,这三秒钟加起来很快。而且必须按顺序完成,以确保以正确的顺序处理队列。在三列 table.
上删除一行似乎花费了非常长的时间我猜应该归咎于复合键...?但我不确定,而且我是 MS SQL 和 EF Core 的新手。任何人都可以指出正确的方向来对此进行分析以确定瓶颈吗?
我将从通过 Visual Studio (Debug > Performance Profiler
) 分析应用程序开始,看看问题到底出在哪里:
- 如果您发现对 SQL 的调用实际上很慢,我会继续检查实际上向 SQL 服务器发送了哪些命令以及哪些命令花费了这么长时间。使用 ExpressProfiler, SQL Server Profiler extension for Azure Data Studio 或 SQL Server Management Studio。这也可能导致 SQL 性能不佳,因为疏忽了维护,例如碎片化的索引等。
- 您可能还会发现问题实际上出在 EF 逻辑中的某处,例如,更改跟踪器试图找出要更新的实体。在这种情况下,您将需要找到一种方法来避免特定问题(例如,每次删除后不保存,使用 SQL 命令手动删除行,使用 Dapper 而不是 EF 等)。
希望这些想法能帮助您解决问题。祝你好运;-)