程序性能。 SQL 服务器,Dynamics AX 2012 R3 CU10
Procedure performance. SQL Server, Dynamics AX 2012 R3 CU10
我们从 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 万行)
- InventT运行s 在第二次安装中增加了 4 倍(4000 万对 1000 万)我不认为这应该解释执行时间的差异。我在这个 table 中创建了一个索引,所以 sum(qty) 是平滑的。 SQL 探查器
中的持续时间 0
- 在 SQL 服务器端,第一个安装有 SQL Server 2008 Enterprise,第二个安装有 SQL Server 2014 Standard。都是 64 位版本。标准版是否有任何类型的限制可能导致这种情况?
- CPU 相同:2 CPU 各 4 个核心。总共 8 个核心,频率为 2.4 Ghz
- 内存在第二次安装时是 64 GB RAM 而在第一次安装时是 32GB,所以问题不可能出在这里
- SQL 服务器中的配置相同。将 tempdb 拆分为 8 个文件 os 每个 10GB。两台服务器的最大并行度都设置为 4
- 第二台服务器的最大内存使用量设置为 56 GB,第一台服务器为 24。
- 我看到的其他区别是应用程序服务器 (AOS) 在第二个安装中只有一个 CPU 核心,而在第一个安装中它有 4 个,但我知道 AOS 反正不做太多处理。
- OS 是 Windows 2012 R2 Standard 64bit 第二次安装。 Windows 2008 R2 Datacenter 64bit 第一个
我不确定 OS o SQL 服务器版本是否会对执行时间产生这样的影响。在订购软件或 OS 更改之前,我需要确保这是问题所在。
我不知道还要检查什么。有什么想法吗?
如果有人想看,代码在class.method:ReleaseUpdateDB401_Cust.updateSalesLineRemainInventFinancial
如问题评论所示,时间差异可以用剩余字段的数据差异来解释。
要加快进程,只需往返数据库一次:
salesLine.skipDataMethods(true);
update_recordset salesLine
setting RemainInventFinancial = -inventTrans.Qty
where salesLine.RemainSalesFinancial != 0
&& salesLine.RemainInventFinancial == 0
join sum(Qty) from inventTrans
where inventTrans.del_InventTransId == salesLine.InventTransId
&&(inventTrans.StatusIssue == StatusIssue::Deducted
|| inventTrans.StatusReceipt == StatusReceipt::Received);
info(int642str(salesLine.rowCount()); // Number of records updated
它会快两个数量级(10-100 倍)。
我们从 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 万行)
- InventT运行s 在第二次安装中增加了 4 倍(4000 万对 1000 万)我不认为这应该解释执行时间的差异。我在这个 table 中创建了一个索引,所以 sum(qty) 是平滑的。 SQL 探查器 中的持续时间 0
- 在 SQL 服务器端,第一个安装有 SQL Server 2008 Enterprise,第二个安装有 SQL Server 2014 Standard。都是 64 位版本。标准版是否有任何类型的限制可能导致这种情况?
- CPU 相同:2 CPU 各 4 个核心。总共 8 个核心,频率为 2.4 Ghz
- 内存在第二次安装时是 64 GB RAM 而在第一次安装时是 32GB,所以问题不可能出在这里
- SQL 服务器中的配置相同。将 tempdb 拆分为 8 个文件 os 每个 10GB。两台服务器的最大并行度都设置为 4
- 第二台服务器的最大内存使用量设置为 56 GB,第一台服务器为 24。
- 我看到的其他区别是应用程序服务器 (AOS) 在第二个安装中只有一个 CPU 核心,而在第一个安装中它有 4 个,但我知道 AOS 反正不做太多处理。
- OS 是 Windows 2012 R2 Standard 64bit 第二次安装。 Windows 2008 R2 Datacenter 64bit 第一个
我不确定 OS o SQL 服务器版本是否会对执行时间产生这样的影响。在订购软件或 OS 更改之前,我需要确保这是问题所在。
我不知道还要检查什么。有什么想法吗?
如果有人想看,代码在class.method:ReleaseUpdateDB401_Cust.updateSalesLineRemainInventFinancial
如问题评论所示,时间差异可以用剩余字段的数据差异来解释。
要加快进程,只需往返数据库一次:
salesLine.skipDataMethods(true);
update_recordset salesLine
setting RemainInventFinancial = -inventTrans.Qty
where salesLine.RemainSalesFinancial != 0
&& salesLine.RemainInventFinancial == 0
join sum(Qty) from inventTrans
where inventTrans.del_InventTransId == salesLine.InventTransId
&&(inventTrans.StatusIssue == StatusIssue::Deducted
|| inventTrans.StatusReceipt == StatusReceipt::Received);
info(int642str(salesLine.rowCount()); // Number of records updated
它会快两个数量级(10-100 倍)。