簡體   English   中英

程序性能。 SQL Server,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萬行)
  • 在第二次安裝中,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 RAM,因此問題不在這里
  • SQL Server中的配置相同。 將tempdb分成8個文件,每個文件10GB。 兩台服務器的最大並行度均設置為4
  • 第二台服務器的最大內存使用量設置為56 GB,第一台服務器的最大內存使用量設置為24 GB。
  • 我看到的另一個區別是,應用服務器(AOS)在第二個安裝中只有一個CPU內核,而在第一個安裝中只有4個CPU內核,但是我知道AOS不會做太多處理。
  • 操作系統為Windows 2012 R2 Standard 64位(第二次安裝)。 Windows 2008 R2 Datacenter 64bit的第一個

我不確定OS o SQL Server版本是否會對執行時間產生如此影響。 在訂購軟件或操作系統更改之前,我需要確保這是問題所在。

我不知道還要檢查什么。 有任何想法嗎?

如果有人想看看,代碼在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倍)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM