|
06.06.2007, 10:19 | #1 |
Участник
|
Здравствуйте! Очень критичный вопрос! У нас такая ситуация при перерасчете журнала зарплаты если там например человек 30 ... времени занимает оооочень много ... плюс к этому на сервере бешенно растет лог транзакций ... не знаете в чем причина ... мб мы что то не так делаем? например 10 челоек из 30 может расчитываться больше 2 часов!!!
|
|
06.06.2007, 10:32 | #2 |
Участник
|
Это значит что у вас большое количество sumindexfields в таблице Payroll Journal Line.
Еще скорее всего у вас модель восстановления SQL Servera - Full. Можно на время расчета зарплаты перейти на модель Simple. Также сделайте Оптимизацию таблицы Payroll Journal Line. |
|
06.06.2007, 10:34 | #3 |
Участник
|
по sumindexfields может быть ... я ничего там не трогал ... значит коряво спроектирована таблица ... модель Full ... делал Simple никак не повлияло на скрость работы ... оптимизацию делал
|
|
06.06.2007, 10:41 | #4 |
Участник
|
Посмотрите сколько всего индексов в таблице Payroll Journal Line. Каждый индекс сильно тормозит работу. Попытайтесь найти и отключить ненужные. Либо отключите обслуживание индексов на Sql Servera
Еще мне помогало Rebuild индексов средствами Sql Servera |
|
07.06.2007, 10:34 | #5 |
Участник
|
С суммовых индексов поснимать галку - обязательно. Для журналов суммовые индексы на SQL-таблицах не только не помогают, а даже вредят. Модель восстановления - пусть Full будет. Когда-нибудь пригодится.
Желательно также отключить создание SQL-ключей, используемых только в отчетах. При пустом состоянии журнала запустите оптимизацию таблицы 14820 средствами Навижн - пускай ее причешет слегка. Также рекомендую пробежаться по видам расчета в настройках и поснимать галки в неиспользуемых в вашей организации элементах, а из расчетных групп удалить неиспользуемые види расчетов. И еще. Ставите галку "Пересортировать журнал после расчета" ? Тоже тормозит сильно. В прилагаемом файле - ключи с моей боевой базы. 800 человек рассчитывается за 15 минут. Правда, тут еще и железо, несомненно, влияет. Также у Вас могут быть отчеты, использующие отключенные у меня ключи. |
|
07.06.2007, 11:44 | #6 |
Участник
|
Цитата:
Сообщение от konrad
С суммовых индексов поснимать галку - обязательно. Для журналов суммовые индексы на SQL-таблицах не только не помогают, а даже вредят. Модель восстановления - пусть Full будет. Когда-нибудь пригодится.
Желательно также отключить создание SQL-ключей, используемых только в отчетах. При пустом состоянии журнала запустите оптимизацию таблицы 14820 средствами Навижн - пускай ее причешет слегка. Также рекомендую пробежаться по видам расчета в настройках и поснимать галки в неиспользуемых в вашей организации элементах, а из расчетных групп удалить неиспользуемые види расчетов. И еще. Ставите галку "Пересортировать журнал после расчета" ? Тоже тормозит сильно. В прилагаемом файле - ключи с моей боевой базы. 800 человек рассчитывается за 15 минут. Правда, тут еще и железо, несомненно, влияет. Также у Вас могут быть отчеты, использующие отключенные у меня ключи. |
|
07.06.2007, 12:10 | #7 |
Участник
|
А перерасчет прозводится, как я понимаю, по отфильтрованной по какому-то признаку группе сотрудников, и раз вручную меняются цифры - то без предварительной очистки строк? Тогда беда. И ничего хорошего я там придумать не смог. Уж больно хитро 14800 кодеюнит работает по вставке записей. Тут проще поштучно сотрудников перерасчитывать. Ручную коррекцию сделал - пересчитал. И к следующему сотруднику. Наши только так и делают. И присланные мной индексы именно для группового расчета не оптимальны.
|
|
07.06.2007, 19:03 | #8 |
Участник
|
|
|
07.06.2007, 12:43 | #9 |
Участник
|
путем различных манипуляций с таблицей Payroll Journal Line и SQL сервером ... удалось добиться скорости перерасчета 2 минуты на человека ... но все равно это много
|
|
07.06.2007, 18:50 | #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; |
|
12.06.2007, 12:13 | #11 |
Участник
|
Не пойму. Посмотрела код. У меня в стандарте такой же код, как вы приводите. Кроме одной строки:
в стандарте эта строка: // UNTIL NEXT(-1) = 0; вы предлагаете поменять на UNTIL FIND('+'); Вы для какой версии приводите код? |
|
13.06.2007, 07:07 | #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.06.2007, 12:32 | #13 |
Участник
|
Цитата:
Цитата:
// UNTIL NEXT(-1) = 0;
вы предлагаете поменять на UNTIL FIND('+'); Вы для какой версии приводите код? Да, хотя я уже сомневаюсь что только это, щас ещё перепроверю. |
|
14.06.2007, 08:50 | #14 |
Участник
|
|
|
08.06.2007, 08:18 | #15 |
Участник
|
в конце приведенного вами кода
DELETE(TRUE); // UNTIL NEXT(-1) = 0; UNTIL FIND('+'); END; END; не совсем понятна строчка UNTIL FIND('+'); - как мне кажется при таком раскладе корректно работать не будет .... неправильно немного ответил - этот ответ относится к последнему сообщения Gmc |
|
08.06.2007, 13:21 | #16 |
Участник
|
Цитата:
Сообщение от Greggy
в конце приведенного вами кода
DELETE(TRUE); // UNTIL NEXT(-1) = 0; UNTIL FIND('+'); END; END; не совсем понятна строчка UNTIL FIND('+'); - как мне кажется при таком раскладе корректно работать не будет .... неправильно немного ответил - этот ответ относится к последнему сообщения Gmc UNTIL FIND('+'); Так там же удаление идет, цикл просто пока все не удалится... |
|
08.06.2007, 14:26 | #17 |
Участник
|
У меня тут такая идея появилась.
А если поправить код так, чтобы использовать DeleteAll по завершении цикла вместо поштучного удаления внутри? Не пробовали? Вроде побыстрее должно выйти. |
|
08.06.2007, 14:30 | #18 |
Участник
|
|
|
09.06.2007, 12:00 | #19 |
Участник
|
Поменял функцию. Поставил код с DeleteAll. И так как у меня измерения на сотрудниках не используются (и не будут) - выкинул из кода манипуляции с измерениями.
Пересчет 860 сотрудников без очистки - 4 минуты на тестовом сервере. Вообще фантастика. На боевом летать теперь будет. GMС, спасибо за наводку на идею! |
|
09.06.2007, 13:19 | #20 |
Участник
|
Цитата:
Сообщение от konrad
Поменял функцию. Поставил код с DeleteAll. И так как у меня измерения на сотрудниках не используются (и не будут) - выкинул из кода манипуляции с измерениями.
Пересчет 860 сотрудников без очистки - 4 минуты на тестовом сервере. Вообще фантастика. На боевом летать теперь будет. GMС, спасибо за наводку на идею! |
|