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