-1

我创建了一个应用程序,在给定足够数据的情况下,它无法完成,并显示“由于 '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

我现在看到(在运行最终性能检查(仪器)之后)垂直的红线只是一个旅鼠——无论你在哪里拖动它,它都会跟随光标。这是有目的的,我猜...

4

1 回答 1

0

这就是最终奏效的方法:两管齐下的攻击:

0) 数据库大师重构了存储过程以提高效率。

1)我通过将数据读取代码分成两部分来重新编写数据读取代码。我确定了要检索的数据的前半部分,并得到了它,然后在短暂的停顿之后第二次通过,检索其余数据。简而言之,以前是这样的:

. . .
ReadData(_unit, _monthBegin, _monthEnd, _beginYearStr, _endYearStr);
. . .

...现在是这样的:

. . .
if // big honkin' amount of data
{
    string monthBegin1 = _monthBegin;
    string monthEnd1 = GetEndMonthOfFirstHalf(_monthBegin, _monthEnd, _beginYearStr, _endYearStr);
    string monthBegin2 = GetBeginMonthOfSecondHalf(_monthBegin, _monthEnd, _beginYearStr, _endYearStr);
    string monthEnd2 = _monthEnd;

    string yearBegin1 = _beginYearStr;
    string yearEnd1 = GetEndYearOfFirstHalf(_monthBegin, _monthEnd, _beginYearStr, _endYearStr);
    string yearBegin2 = GetBeginYearOfSecondHalf(_monthBegin, _monthEnd, _beginYearStr, _endYearStr);
    string yearEnd2 = _endYearStr;

    ReadData(_unit, monthBegin1, monthEnd1, yearBegin1, yearEnd1);
    Thread.Sleep(10000);
    ReadData(_unit, monthBegin2, monthEnd2, yearBegin2, yearEnd2);
}
else // a "normal" Unit (not an overly large amount of data to be processed)
{
    ReadData(_unit, _monthBegin, _monthEnd, _beginYearStr, _endYearStr);
}
. . .

它现在成功运行完成,没有任何异常。我不知道问题是否完全与数据库有关,或者是否所有 Excel 互操作活动也有问题,但我现在可以通过此操作生成 1,341KB 的 Excel 文件。

于 2016-03-17T20:16:42.117 回答