我创建了一个应用程序,在给定足够数据的情况下,它无法完成,并显示“由于 'ACTIVE_TRANSACTION',数据库 'tempdb' 的事务日志已满。” 和“找不到表 0”。
报告使用的存储过程没有显式引用“tempdb”,因此它必须是 SQL Server 自己管理的东西。
无论如何,我通过分析 > 性能和诊断在 Visual Studio 2013 中运行了“资源争用”分析。
完成后,它在“并发分析报告”中告诉我,总共有 30,790 个争用,“Handle2”和“Multiple Handles 1”占“最争用资源”和“_CoreExeMain”的 99% 以上,线程 ID 4936 成为“最具争议的话题”
我想这一切都很有趣,但现在我知道了,我能做些什么呢?
30,790 的总争用量是否过多?听起来像,但我不知道。但同样,假设是这样,这些信息似乎并不能告诉我任何有价值的东西,即:我能做些什么来改善这种情况?如何以编程方式防止或限制资源和/或线程争用?
生成的报告中没有错误,这六条消息属于“仅供参考”类型。有一个警告:
警告 1 DA0022:# Gen 1 Collections / # Gen 2 Collections = 2.52;Gen 2 垃圾回收的发生率相对较高。如果按照设计,您的程序的大部分数据结构都被分配并保留了很长时间,那么这通常不是问题。但是,如果这种行为是无意的,您的应用程序可能会固定对象。如果您不确定,您可以收集 .NET 内存分配数据和对象生存期信息,以了解您的应用程序使用的内存分配模式。
...但是数据结构“长时间”的持久化确实是设计使然。
更新
然后我运行了“.NET 内存分配”报告,在这里我也不知道该怎么做:
1.24 亿字节是否过多?分配最多内存的函数有什么不好的,或者哪些类型分配的内存最多?
我也不明白为什么在生成报告后红色垂直线会移动;它首先在“616”附近,然后移至 0(如上面的屏幕截图所示),现在大约为 120。
更新 2
我现在看到(在运行最终性能检查(仪器)之后)垂直的红线只是一个旅鼠——无论你在哪里拖动它,它都会跟随光标。这是有目的的,我猜...