|
![]() |
#1 |
Участник
|
Здравствуйте! Очень критичный вопрос! У нас такая ситуация при перерасчете журнала зарплаты если там например человек 30 ... времени занимает оооочень много ... плюс к этому на сервере бешенно растет лог транзакций ... не знаете в чем причина ... мб мы что то не так делаем? например 10 челоек из 30 может расчитываться больше 2 часов!!!
|
|
![]() |
#2 |
Участник
|
Это значит что у вас большое количество sumindexfields в таблице Payroll Journal Line.
Еще скорее всего у вас модель восстановления SQL Servera - Full. Можно на время расчета зарплаты перейти на модель Simple. Также сделайте Оптимизацию таблицы Payroll Journal Line. |
|
![]() |
#3 |
Участник
|
по sumindexfields может быть ... я ничего там не трогал ... значит коряво спроектирована таблица ... модель Full ... делал Simple никак не повлияло на скрость работы ... оптимизацию делал
|
|
![]() |
#4 |
Участник
|
Посмотрите сколько всего индексов в таблице Payroll Journal Line. Каждый индекс сильно тормозит работу. Попытайтесь найти и отключить ненужные. Либо отключите обслуживание индексов на Sql Servera
Еще мне помогало Rebuild индексов средствами Sql Servera |
|
![]() |
#5 |
Участник
|
С суммовых индексов поснимать галку - обязательно. Для журналов суммовые индексы на SQL-таблицах не только не помогают, а даже вредят. Модель восстановления - пусть Full будет. Когда-нибудь пригодится.
Желательно также отключить создание SQL-ключей, используемых только в отчетах. При пустом состоянии журнала запустите оптимизацию таблицы 14820 средствами Навижн - пускай ее причешет слегка. Также рекомендую пробежаться по видам расчета в настройках и поснимать галки в неиспользуемых в вашей организации элементах, а из расчетных групп удалить неиспользуемые види расчетов. И еще. Ставите галку "Пересортировать журнал после расчета" ? Тоже тормозит сильно. В прилагаемом файле - ключи с моей боевой базы. 800 человек рассчитывается за 15 минут. Правда, тут еще и железо, несомненно, влияет. Также у Вас могут быть отчеты, использующие отключенные у меня ключи. |
|
![]() |
#6 |
Участник
|
Цитата:
Сообщение от konrad
![]() С суммовых индексов поснимать галку - обязательно. Для журналов суммовые индексы на SQL-таблицах не только не помогают, а даже вредят. Модель восстановления - пусть Full будет. Когда-нибудь пригодится.
Желательно также отключить создание SQL-ключей, используемых только в отчетах. При пустом состоянии журнала запустите оптимизацию таблицы 14820 средствами Навижн - пускай ее причешет слегка. Также рекомендую пробежаться по видам расчета в настройках и поснимать галки в неиспользуемых в вашей организации элементах, а из расчетных групп удалить неиспользуемые види расчетов. И еще. Ставите галку "Пересортировать журнал после расчета" ? Тоже тормозит сильно. В прилагаемом файле - ключи с моей боевой базы. 800 человек рассчитывается за 15 минут. Правда, тут еще и железо, несомненно, влияет. Также у Вас могут быть отчеты, использующие отключенные у меня ключи. |
|
![]() |
#7 |
Участник
|
А перерасчет прозводится, как я понимаю, по отфильтрованной по какому-то признаку группе сотрудников, и раз вручную меняются цифры - то без предварительной очистки строк? Тогда беда. И ничего хорошего я там придумать не смог. Уж больно хитро 14800 кодеюнит работает по вставке записей. Тут проще поштучно сотрудников перерасчитывать. Ручную коррекцию сделал - пересчитал. И к следующему сотруднику. Наши только так и делают. И присланные мной индексы именно для группового расчета не оптимальны.
|
|
![]() |
#8 |
Участник
|
|
|
![]() |
#9 |
Участник
|
путем различных манипуляций с таблицей Payroll Journal Line и SQL сервером ... удалось добиться скорости перерасчета 2 минуты на человека ... но все равно это много
![]() |
|
![]() |
#10 |
Участник
|
Цитата:
Я переделал так: WITH PayrollJnlLine DO BEGIN RESET; SETRANGE(Template,Template); SETRANGE("Batch Name","Batch Name"); JournalDimension.RESET; JournalDimension.SETRANGE("Table ID",14820); JournalDimension.SETRANGE("Journal Template Name",Template); JournalDimension.SETRANGE("Journal Batch Name","Batch Name"); IF IncludCurLine THEN SETFILTER("Line No.",'>=%1',"Line No.") ELSE SETFILTER("Line No.",'>%1',"Line No."); IF FIND('+') THEN BEGIN REPEAT PayrollJnlLine2 := PayrollJnlLine; PayrollJnlLine2."Line No." := "Line No." + 10000; PayrollJnlLine2.INSERT; JournalDimension.SETRANGE("Journal Line No.","Line No."); IF JournalDimension.FIND('+') THEN REPEAT JournalDimension2 := JournalDimension; JournalDimension2."Journal Line No." := PayrollJnlLine2."Line No."; // JournalDimension.DELETE; JournalDimension2.INSERT; // UNTIL JournalDimension.NEXT(-1) = 0; // UNTIL JournalDimension.FIND('+'); DELETE(TRUE); // UNTIL NEXT(-1) = 0; UNTIL FIND('+'); END; END; |
|
![]() |
#11 |
Участник
|
Не пойму. Посмотрела код. У меня в стандарте такой же код, как вы приводите. Кроме одной строки:
в стандарте эта строка: // UNTIL NEXT(-1) = 0; вы предлагаете поменять на UNTIL FIND('+'); Вы для какой версии приводите код? |
|
![]() |
#12 |
Участник
|
Цитата:
Сообщение от Gmc
![]() Была похожая проблема, обрати внимание на CU 14800 функцию MoveLines.
Я переделал так: WITH PayrollJnlLine DO BEGIN RESET; SETRANGE(Template,Template); SETRANGE("Batch Name","Batch Name"); JournalDimension.RESET; JournalDimension.SETRANGE("Table ID",14820); JournalDimension.SETRANGE("Journal Template Name",Template); JournalDimension.SETRANGE("Journal Batch Name","Batch Name"); IF IncludCurLine THEN SETFILTER("Line No.",'>=%1',"Line No.") ELSE SETFILTER("Line No.",'>%1',"Line No."); IF FIND('+') THEN BEGIN REPEAT PayrollJnlLine2 := PayrollJnlLine; PayrollJnlLine2."Line No." := "Line No." + 10000; PayrollJnlLine2.INSERT; JournalDimension.SETRANGE("Journal Line No.","Line No."); IF JournalDimension.FIND('+') THEN REPEAT JournalDimension2 := JournalDimension; JournalDimension2."Journal Line No." := PayrollJnlLine2."Line No."; // JournalDimension.DELETE; JournalDimension2.INSERT; // UNTIL JournalDimension.NEXT(-1) = 0; // UNTIL JournalDimension.FIND('+'); DELETE(TRUE); // UNTIL NEXT(-1) = 0; UNTIL FIND('+'); END; END; IF FIND('+') THEN BEGIN REPEAT ... ... UNTIL FIND('+'); END в приведенном примере будет всего одна итерация насколько я понимаю! |
|
![]() |
#13 |
Участник
|
Цитата:
Цитата:
// UNTIL NEXT(-1) = 0;
вы предлагаете поменять на UNTIL FIND('+'); Вы для какой версии приводите код? Да, хотя я уже сомневаюсь что только это, щас ещё перепроверю. |
|
![]() |
#14 |
Участник
|
|
|
![]() |
#15 |
Участник
|
в конце приведенного вами кода
DELETE(TRUE); // UNTIL NEXT(-1) = 0; UNTIL FIND('+'); END; END; не совсем понятна строчка UNTIL FIND('+'); - как мне кажется при таком раскладе корректно работать не будет .... неправильно немного ответил - этот ответ относится к последнему сообщения Gmc |
|
![]() |
#16 |
Участник
|
Цитата:
Сообщение от Greggy
![]() в конце приведенного вами кода
DELETE(TRUE); // UNTIL NEXT(-1) = 0; UNTIL FIND('+'); END; END; не совсем понятна строчка UNTIL FIND('+'); - как мне кажется при таком раскладе корректно работать не будет .... неправильно немного ответил - этот ответ относится к последнему сообщения Gmc UNTIL FIND('+'); Так там же удаление идет, цикл просто пока все не удалится... |
|
![]() |
#17 |
Участник
|
У меня тут такая идея появилась.
А если поправить код так, чтобы использовать DeleteAll по завершении цикла вместо поштучного удаления внутри? Не пробовали? Вроде побыстрее должно выйти. |
|
![]() |
#18 |
Участник
|
|
|
![]() |
#19 |
Участник
|
Поменял функцию. Поставил код с DeleteAll. И так как у меня измерения на сотрудниках не используются (и не будут) - выкинул из кода манипуляции с измерениями.
Пересчет 860 сотрудников без очистки - 4 минуты на тестовом сервере. Вообще фантастика. На боевом летать теперь будет. GMС, спасибо за наводку на идею! ![]() |
|
![]() |
#20 |
Участник
|
Цитата:
Сообщение от konrad
![]() Поменял функцию. Поставил код с DeleteAll. И так как у меня измерения на сотрудниках не используются (и не будут) - выкинул из кода манипуляции с измерениями.
Пересчет 860 сотрудников без очистки - 4 минуты на тестовом сервере. Вообще фантастика. На боевом летать теперь будет. GMС, спасибо за наводку на идею! ![]() |
|