Мы запускаем этот код из нашего приложения 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
Это может быть очевидный вопрос, но сколько записей обновляется в двух средах? И.Е. где 'RemainSalesFinancial! = 0 && RemainInventFinancial == 0'. Так как это '.doUpdate()', который не вызывает никакой бизнес-логики, вы можете сделать это обновление непосредственно в SQL. –
Ничего себе! Я не знаю, как я это пропустил! это так очевидно.Действительно, во второй среде почти все транзакции имеют RemainSalesFinancial! = 0. В первом случае они в основном = 0, поэтому они отфильтровываются. Благодаря! (сошел с ума) –
Все пулевые баллы в вашем вопросе делают этот комментарий еще более забавным. Хорошо, надеюсь, вы сможете это решить. Опять же, это может быть преобразовано в прямое SQL-обновление, если вам нужно, при условии, что это не относится к «атомному» процессу. –