【发布时间】:2016-08-24 07:34:25
【问题描述】:
我们从我们的 ERP 应用程序 Dynamics AX 2012 R3 CU10 运行此代码,这是从 AX 4 升级过程的一部分。
ttsbegin;
while select forupdate salesLine
where salesLine.RemainSalesFinancial != 0
&& salesLine.RemainInventFinancial == 0
{
salesLine.RemainInventFinancial = 0;
select sum(Qty) from inventTrans
where inventTrans.del_InventTransId == salesLine.InventTransId
&&(inventTrans.StatusIssue == StatusIssue::Deducted
|| inventTrans.StatusReceipt == StatusReceipt::Received);
salesLine.RemainInventFinancial = -inventTrans.Qty;
salesLine.doUpdate();
}
ttscommit;
问题是我们为 2 次安装运行了这个过程。在第一次安装中,整个过程需要 45 分钟才能执行,而在第二次安装中则需要 24 小时。
我正在尝试找出性能问题出在哪里。这是我的观察:
- SalesLine 行数几乎相同(800 万行)
- InventTrans 在第二次安装中增加了 4 倍(4000 万对 1000 万)我认为这不应该解释执行时间的差异。我在这个表中创建了一个索引,所以 sum(qty) 是平滑的。 SQL Profiler 中的持续时间 0
- 在 SQL Server 端,第一次安装的是 SQL Server 2008 Enterprise,而第二次安装的是 SQL Server 2014 Standard。均为 64 位版本。标准版是否有任何类型的限制可能导致此问题?
- CPU 相同:2 个 CPU,每个 4 核。总共 8 个 2.4 Ghz 核心
- 第二次安装时内存为 64 GB RAM,而第一次安装时内存为 32GB,所以问题不在这里
- SQL Server 中的配置相同。将 tempdb 拆分为 8 个文件,每个文件 10GB。两台服务器的最大并行度设置为 4
- 第二台服务器的最大内存使用量设置为 56 GB,第一台服务器设置为 24。
- 我看到的其他区别是,应用程序服务器 (AOS) 在第二次安装时只有一个 CPU 内核,而在第一次安装时它有 4 个,但我知道 AOS 并没有做太多的处理。
- 第二次安装时操作系统为 Windows 2012 R2 Standard 64bit。第一个中的 Windows 2008 R2 Datacenter 64bit
我不确定 OS o SQL server 版本是否会对执行时间产生如此大的影响。在订购软件或操作系统更改之前,我需要确保这是问题所在。
我不知道还要检查什么。有什么想法吗?
如果有人想看看,代码在class.method中:ReleaseUpdateDB401_Cust.updateSalesLineRemainInventFinancial
【问题讨论】:
-
这可能是一个显而易见的问题,但是在这两个环境中更新了多少条记录? IE。其中
RemainSalesFinancial != 0 && RemainInventFinancial == 0。由于这是一个不调用任何业务逻辑的.doUpdate(),因此您可以直接在 SQL 中进行此更新。 -
哇!我不知道我是怎么错过的!太明显了。实际上,在第二种环境中,几乎所有交易的 RemainSalesFinancial != 0。在第一种环境中,它们大多为 =0,因此它们被过滤掉了。谢谢! (快疯了)
-
您问题中的所有要点使此评论更加有趣。那么希望你能解决它。同样,如果需要,这可以转换为直接 SQL 更新,前提是它不属于
atomic进程。 -
再看一遍,这可能是几个“步骤”的一部分,其中一个步骤填充了
inventTrans.del_InventTransId。.del_表示升级后标记为删除的字段。如果此字段填充了数据,如果需要,您可以在 SQL 中安全地执行此操作。InventTransId被规范化并从InventTrans移动到新表InventTransOrigin,并在 AX12 中被RecId引用。或者del_InventTransId可以是来自InventTransId的重命名字段,也可以只是从同一张表的另一列填充的新列。 -
您也可以使用
update_recordset。记得先拨打skipDateMethods(true)。
标签: sql sql-server axapta dynamics-ax-2012 dynamics-ax-2012-r3