|
13.01.2021, 15:37 | #1 |
Участник
|
Цитата:
А запрос к таблице SysDatabaseLog вроде быстро выполнялся. Прошло уже несколько лет с того времени. По-любому надо пробовать. По-моему это самый простой способ решить данную проблему. А начинать пробовать надо с простых способов. Хотя все-таки поймать изменение конкретного поля через таблицу SysDatabaseLog - задача не очень тривиальная, но пример как это сделать есть. Даже на этом форуме выкладывали.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
13.01.2021, 15:39 | #2 |
Участник
|
Запустил у себя сейчас такой джоб.
Для 26 тысяч клиентов он отработал примерно за 2 минуты (если убрать вывод в инфолог) Это для Аксапты версии 3.0 X++: static void sysDatabaseLogFieldChangedCustAxForum(Args _args) { CustTable custTable; SysDatabaseLog SysDatabaseLog; int i; container tmp; SysOperationProgress sysOperationProgress = new SysOperationProgress(1); int stepCount; int total; UserInfo UserInfo; ; select count(RecId) from custTable; total = custTable.RecId; sysOperationProgress.setTotal(total); while select custTable { stepCount ++; sysOperationProgress.setCount(stepCount); sysOperationProgress.setText(strFmt("%1 запись из %2", stepCount, total)); while select SysDatabaseLog order by createdDate, createdTime where SysDatabaseLog.LogRecId == custTable.RecId && SysDatabaseLog.table == custTable.TableId { if (typeOf(conpeek(SysDatabaseLog.Data, 1)) == Types::Container) { for ( i = 1; i <= conlen(SysDatabaseLog.data); i ++) { tmp = conpeek(SysDatabaseLog.Data, i ); if (fieldExt2Id(conpeek(tmp, 1)) == fieldnum(custTable, zResponsibleDivision)) { if(conpeek(tmp, 3) != conpeek(tmp, 2)) { select firstonly UserInfo where UserInfo.Id == SysDatabaseLog.createdBy; info(strfmt("%1 ~ %2 ~ %3 ~ %4 ~ %5", custTable.AccountNum, UserInfo.name, SysDatabaseLog.createdDate, conpeek(tmp, 3),conpeek(tmp, 2) )); } } } } } } }
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ Последний раз редактировалось Ace of Database; 13.01.2021 в 15:41. |
|
13.01.2021, 15:43 | #3 |
Участник
|
Т.е. 26000 вызовов select для таблицы SysDatabaseLog срабатывают за 2 минуты и плюс еще время на парсинг
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
13.01.2021, 15:48 | #4 |
Участник
|
В таблице SysDatabaseLog сейчас 74 миллиона записей. Похоже, что ее перестали обрезать
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
13.01.2021, 15:55 | #5 |
Участник
|
Автор топика может для своих нужд переписать джоб так, чтобы он отправил всего один запрос к SysDatabaseLog вместо 26 тысяч запросов, но тогда придется усложнить парсинг, чтобы сохранять предыдущие значения полей для каждой записи. Все-таки у него 6 миллионов клиентов, а не 26 тысяч. Но в выборку у него попадут не более нескольких сотен записей, т.к. ему нужны изменения только за последнюю минуту.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
Теги |
aif, ax2012, change tracking, интеграция, как правильно |
|
|