我有一个小型的c#应用程序,它使用Entitiy Framework 6将文本文件解析为某种数据库结构。
通常,文件内容解析为 3 个表:
Table1 --(1-n)-- Table2 --(1-n)-- Table3
该应用程序运行了几个月,在开发、阶段和生产环境中没有任何问题。
上周它停在舞台上,现在我试图找出原因。
一个文件包含 ~ 100 个条目 表 1, ~2000 个条目 表2, ~2000 个条目 表 3
.SaveChanges()
在每个文件之后调用。
我收到以下超时异常:
超时已过期。操作完成之前经过的超时期限或服务器没有响应。该语句已终止。
AutoDetectChangesEnabled
设置为 false。
因为有第 4 个表,我在每个文件之后执行一个更新语句,整个事情周围都有事务,所以我删除了第 4 个表和事务内容,但问题仍然存在。
为了测试这是否只是一个性能问题,我设置了 Database.CommandTimeout = 120 没有任何效果,它在 2 分钟后仍然超时。
(在问题之前,一个文件在大约 5 秒内存储,这绝对没问题(
如果我使用 SQL Server Profiler 查看 SQL Server,我可以在调用.SaveChanges()
后看到以下内容:
SQL Server Profiler 仅显示Table3
的前几个INSERT
语句(始终显示前 4-15 个语句,并且所有语句都在.SaveChanges()
之后不久(
之后:在超时发生之前没有新条目。
我完全不知道要检查什么,因为代码中没有错误或类似的东西。
如果我看一下SQL Server,它绝对没有理由延迟查询或类似的东西(CPU,内存和磁盘空间都可以(。
很高兴对此发表每条评论,如果您想了解更多信息,请告诉我。
此致敬意
通过在 Table1 中重建碎片索引来修复它。
以下文章有助于了解如何处理碎片索引:
https://solutioncenter.apexsql.com/why-when-and-how-to-rebuild-and-reorganize-sql-server-indexes/
(如果某些模组仍然认为这不是有效的答案,任何解释都会很棒(