2

Мы запускаем этот код из нашего приложения ERP Dynamics AX 2012 R3 CU10, который является частью процесса обновления от AX 4.Выполнение процедуры. SQL Server, Dynamics AX 2012 R3 CU10

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 число строк практически одинаковы (8 миллионов строк)
  • InventTrans в 4 раза больше, во второй установке (40 млн против 10 млн) Я не думаю, что это должно учитывайте такую ​​разницу во времени выполнения. Я создал индекс в этой таблице, поэтому сумма (qty) является гладкой. Длительность 0 в SQL Profiler
  • На стороне сервера SQL первая установка имеет SQL Server 2008 Enterprise и вторую установку SQL Server 2014 Standard. Обе версии 64 бит. Имеет ли стандартная версия какое-либо ограничение, которое может вызвать это?
  • Процессор такой же: 2 процессора по 4 ядра каждый. Всего 8 ядер с 2,4 ГГц
  • Память 64 ГБ ОЗУ во второй установке против 32 ГБ на первом, поэтому проблемы здесь быть не может
  • Конфигурация на SQL-сервере такая же. Разделенный tempdb в 8 файлах по 10 ГБ каждый. Максимальная степень паралилизма, установленная на 4 на обоих серверах
  • Максимальный объем памяти составляет 56 ГБ на втором сервере, 24 - в первом.
  • Другие различия, которые я вижу, это то, что на сервере приложений (AOS) есть только одно ядро ​​ЦП во второй установке, а в первом - 4, но я понимаю, что AOS практически не обрабатывает.
  • ОС - Windows 2012 R2 Standard 64bit во второй установке. Windows 2008 R2 Datacenter 64 бит в первом

Я не уверен, что OS o SQL-версия сервера может иметь такое влияние во время выполнения. Мне нужно убедиться, что это проблема, прежде чем заказывать программное обеспечение или смену ОС.

Я не знаю, что еще проверить. Есть идеи?

В случае, если кто-то хочет, чтобы посмотреть, код в class.method: ReleaseUpdateDB401_Cust.updateSalesLineRemainInventFinancial

+1

Это может быть очевидный вопрос, но сколько записей обновляется в двух средах? И.Е. где 'RemainSalesFinancial! = 0 && RemainInventFinancial == 0'. Так как это '.doUpdate()', который не вызывает никакой бизнес-логики, вы можете сделать это обновление непосредственно в SQL. –

+0

Ничего себе! Я не знаю, как я это пропустил! это так очевидно.Действительно, во второй среде почти все транзакции имеют RemainSalesFinancial! = 0. В первом случае они в основном = 0, поэтому они отфильтровываются. Благодаря! (сошел с ума) –

+1

Все пулевые баллы в вашем вопросе делают этот комментарий еще более забавным. Хорошо, надеюсь, вы сможете это решить. Опять же, это может быть преобразовано в прямое SQL-обновление, если вам нужно, при условии, что это не относится к «атомному» процессу. –

ответ

3

В комментариях вопросов показывает разницу во время можно объяснить различие в данных относительно оставшихся полей.

Для ускорения в процес использовать только один туда-обратно в базу данных:

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 

Это будет на два порядка manitude (10-100 раз) быстрее.

Смежные вопросы