【问题标题】:Procedure performance. SQL Server, Dynamics AX 2012 R3 CU10程序性能。 SQL Server、Dynamics AX 2012 R3 CU10
【发布时间】: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


【解决方案1】:

正如问题 cmets 所示,时间差可以通过剩余字段的数据差异来解释。

为了加快进程,只使用一次到数据库的往返:

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 倍)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多