程序性能。 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 小时。

我正在尝试找出性能问题出在哪里。这是我的观察:

我不确定 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 倍)。