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, 12:43 | #8 |
Участник
|
путем различных манипуляций с таблицей Payroll Journal Line и SQL сервером ... удалось добиться скорости перерасчета 2 минуты на человека ... но все равно это много
|
|
07.06.2007, 18:50 | #9 |
Участник
|
Цитата:
Я переделал так: 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; |
|
07.06.2007, 19:03 | #10 |
Участник
|
|
|
08.06.2007, 08:18 | #11 |
Участник
|
в конце приведенного вами кода
DELETE(TRUE); // UNTIL NEXT(-1) = 0; UNTIL FIND('+'); END; END; не совсем понятна строчка UNTIL FIND('+'); - как мне кажется при таком раскладе корректно работать не будет .... неправильно немного ответил - этот ответ относится к последнему сообщения Gmc |
|
08.06.2007, 13:21 | #12 |
Участник
|
Цитата:
Сообщение от Greggy
в конце приведенного вами кода
DELETE(TRUE); // UNTIL NEXT(-1) = 0; UNTIL FIND('+'); END; END; не совсем понятна строчка UNTIL FIND('+'); - как мне кажется при таком раскладе корректно работать не будет .... неправильно немного ответил - этот ответ относится к последнему сообщения Gmc UNTIL FIND('+'); Так там же удаление идет, цикл просто пока все не удалится... |
|
08.06.2007, 14:26 | #13 |
Участник
|
У меня тут такая идея появилась.
А если поправить код так, чтобы использовать DeleteAll по завершении цикла вместо поштучного удаления внутри? Не пробовали? Вроде побыстрее должно выйти. |
|
08.06.2007, 14:30 | #14 |
Участник
|
|
|
09.06.2007, 12:00 | #15 |
Участник
|
Поменял функцию. Поставил код с DeleteAll. И так как у меня измерения на сотрудниках не используются (и не будут) - выкинул из кода манипуляции с измерениями.
Пересчет 860 сотрудников без очистки - 4 минуты на тестовом сервере. Вообще фантастика. На боевом летать теперь будет. GMС, спасибо за наводку на идею! |
|
09.06.2007, 13:19 | #16 |
Участник
|
Цитата:
Сообщение от konrad
Поменял функцию. Поставил код с DeleteAll. И так как у меня измерения на сотрудниках не используются (и не будут) - выкинул из кода манипуляции с измерениями.
Пересчет 860 сотрудников без очистки - 4 минуты на тестовом сервере. Вообще фантастика. На боевом летать теперь будет. GMС, спасибо за наводку на идею! |
|
09.06.2007, 15:11 | #17 |
Участник
|
Тестовый сервер - обычная рабочая станция, 4 гига мозгов, двухядерный процессор 3000 Мгц, два идишных диска по 100Гб
У меня механизм такой. Из внешних источников в журнал расчета ЗП закачиваются "внешние" проводки ряда начислений-удержаний. От 4 до 16 проводок (строк) по сотруднику. Далее эапускается расчет без очистки журнала. При расчете создается еще порядка 5-15 строк (расчетных элементов) на сотрудника, в ряде расчетных элементов которых используются закачанные ранее внешние проводки. Далее при выверке могут правиться ( и правятся) суммы на каких-либо расчетных элементах (кроме закачанных из внешних источников). Далее в штатном режиме происходит перерасчет исправленного сотрудника без очистки. Но в данном тесте штатный "поштучный" перерасчет я не использовал. На паре десятков пиплов поменял суммы и запустил групповой перерасчет по всему журналу без очистки. (правда, и без пересортировки). |
|
09.06.2007, 15:29 | #18 |
Участник
|
|
|
12.06.2007, 12:13 | #19 |
Участник
|
Не пойму. Посмотрела код. У меня в стандарте такой же код, как вы приводите. Кроме одной строки:
в стандарте эта строка: // UNTIL NEXT(-1) = 0; вы предлагаете поменять на UNTIL FIND('+'); Вы для какой версии приводите код? |
|
12.06.2007, 13:37 | #20 |
Участник
|
Возник вопрос правда не совсем тему.
Объем зарплатной базы с января этого года составлял 6 гб. Прочитав тему - убрала с Зарпл.ЖурналСтроки галки с MainSiftIndex. Решила убрать эти же галки и с Зарпл.КнигиОперации. Объем базы составил 1.4 гб. Я в шоке. 4 гб - составляли ключи? И теперь собственно вопрос. Чем мне это грозит? В принципе flow-field поля в Зарплате не используются-как в основном Навижине. Поэтому мне кажется ничем не грозит. |
|