Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 3459 - Очень долгое перепроведение документов   Make a simular bug
Summary: Очень долгое перепроведение документов
Status: CLOSED FIXED
Alias: None
Product: SELTA@Etersoft
Classification: Продукты (Products)
Component: Общее (show other bugs)
Version: 1.0.5
Hardware: PC All
: P4 minor
Target Milestone: версия 1.0.4
Assignee: Калюхович Юрий
QA Contact:
URL:
Whiteboard:
Keywords:
: 2191 (view as bug list)
Depends on:
Blocks: 3166
  Show dependency treegraph
 
In work:
Reported: 2009-02-10 15:28 MSK by Станислав Коробейников
Modified: 2009-08-31 12:27 MSD (History)
3 users (show)

See Also:
Заявки RT: http://rt.etersoft.ru/Ticket/Display.html?id=9560
Связано с:
Дата напоминания:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Станислав Коробейников 2009-02-10 15:28:20 MSK
Серьезные тормоза (очень серьезные) при отмене проводки

как получить:
Исходная конфигурация: Демонстрационная Комплексная БД из поставки 1С
1) Выгружаем данные штатными средствами
2) Создаем новую пустую конфигурацию для SQL, создаем БД на сервере через Selta
3) Пробуем загрузить данные из п.1.

Выгрузка зависает минут на 10-15. На момент зависания в строке
состояния надпись о загрузке "Начисления заработной платы сотрудникам"

Далее открыть получившуюся базу. Сменить период расчета ЗП на
следующий (предупреждения о неначисленной зп проигнорировать). Ввести
документ "начисление заработной платы". Заполнить автоматически
сотрудниками. Перепровести несколько раз. Первая проводка - полет
нормальный. Вторая - зависает (уже 20 минут работает).

Исходя из того, что отмена проводки так же зависает, а при
перепроводке эта операция также выполняется (причем первой), логично
будет предположить, что тормоза проявляются именно при отмене
проводки.
Comment 1 Станислав Коробейников 2009-02-27 17:01:21 MSK
Что-то я не смог повторить. 
1. База у меня пустая
2. Сменить период расчета ЗП не знаю как 
Comment 2 Станислав Коробейников 2009-03-06 16:35:36 MSK
Поставил ЗиК. Подозреваю, что эффект тот же. Делаю непроведенным, 1с виснет. Точнее выполняет один и тот же запрос 
Select COUNT(*) from CJ447(NOLOCK) where IDS=? and DATEE>=? and DATEB<=? and ( ( DATEE=? and ID<=? ) or  ( DATEE<? ) )
Я так понимаю ждет каких-то изменений.
MS делает все быстро.
Comment 3 Станислав Коробейников 2009-03-11 17:59:17 MSK
Не понял что не так. В трассировке проводка занимает 50 000 тыс. строк. Особо не отследишь. Хотя я еще не смотрел, что конкретно он получает в повторяющихся запросах. 
Comment 4 Станислав Коробейников 2009-03-16 17:56:45 MSK
Не могу найти создание курсора на повторяющийся запрос: Select COUNT(*) from CJ447(NOLOCK) where IDS=? and DATEE>=? and DATEB<=? and (
( DATEE=? and ID<=? ) or  ( DATEE<? ) )
Может от не создается по каким-то причинам?
Зато такой курсор создается все время. Эти запросы выполняются по очереди. 
SELECT * FROM CJ447 WHERE IDRECALC=? ORDER BY IDRECALC, ROW_ID
Но в поле IDRECALC лежат только нули. 


Comment 5 Станислав Коробейников 2009-03-17 17:50:16 MSK
Особо похвастаться нечем, кроме наблюдения, что до последнего момента, где все зациклевается все происходит одинаково у posgres и ms sql.
Сделал триггер, 

CREATE TRIGGER MAKELOGCJ447 ON [dbo].[CJ447] 
FOR INSERT, UPDATE, DELETE 
AS
if exists(SELECT * FROM INSERTED) INSERT INTO LOGCJ447 SELECT *,'INSERTED' FROM INSERTED;
if exists(SELECT * FROM DELETED) INSERT INTO LOGCJ447 SELECT *,'DELETED' FROM DELETED;

что бы отследить, что меняет 1c в таблице CJ447. Но 1с с ним падает. Почему не выяснил. 
Comment 6 Калюхович Юрий 2009-03-19 11:46:36 MSK
(In reply to comment #5)
> Особо похвастаться нечем, кроме
> наблюдения, что до последнего момента, где
> все зациклевается все происходит
> одинаково у posgres и ms sql.
> Сделал триггер, 
> 
> CREATE TRIGGER MAKELOGCJ447 ON [dbo].[CJ447] 
> FOR INSERT, UPDATE, DELETE 
> AS
> if exists(SELECT * FROM INSERTED) INSERT INTO LOGCJ447 SELECT *,'INSERTED' FROM
> INSERTED;
> if exists(SELECT * FROM DELETED) INSERT INTO LOGCJ447 SELECT *,'DELETED' FROM
> DELETED;
> 
> что бы отследить, что меняет 1c в таблице CJ447.
> Но 1с с ним падает. Почему не выяснил. 
> 

падает только на постгри? ты его отдельно от сельты делал или в 1с? если в 1с - то может быть потому, что старые сборки сельты не знают что делать с " [dbo].[CJ447] ", умели только " dbo.CJ447 "
Comment 7 Станислав Коробейников 2009-03-19 13:16:38 MSK
Не, триггер я сдеал в MS SQL'е. Все должно быть нормально. Я проверил. В таблицу можно добавлять, удалять, изменять. Но 1с почему-то падает.
Comment 8 Калюхович Юрий 2009-03-19 19:58:30 MSK
воспроизвел и на комплексной, при второй проводке зависает
Comment 9 Калюхович Юрий 2009-03-20 18:26:25 MSK
(In reply to comment #0)
> документ "начисление заработной платы".
> Заполнить автоматически
> сотрудниками. Перепровести несколько раз.
> Первая проводка - полет
> нормальный. Вторая - зависает (уже 20 минут
> работает).

что- то теперь не воспроизвелось уже
Comment 10 Калюхович Юрий 2009-03-20 19:34:53 MSK
воспроизводится, в том же варианте, вторая проводка документа "начисление зп"
Comment 11 Станислав Коробейников 2009-03-24 18:01:18 MSK
Виснет после окончания всех действий в процедуре отмены проводки, там вызывается метод ОчиститьДвижения (вроде сам). На нем и виснет. 
Но это не особо помогло, хотя можно посмотреть все запросы. Но они простые и с ними не должно быть проблем. 
Comment 12 Калюхович Юрий 2009-03-25 11:04:16 MSK
есть вероятность что какой-то запрос транслируется неправильно, хотя запросы простые
или пробема может быть в курсорах
Стас, еще есть варианты?
Comment 13 Калюхович Юрий 2009-03-25 17:11:54 MSK
получил лог сельты... попробую что-нибудь откопать
Comment 14 Калюхович Юрий 2009-03-25 17:33:58 MSK
при зависании процесс постгри что-то делает, видны select, fetch, declare cursor, move, delete, savepoint
Comment 15 Станислав Коробейников 2009-03-25 17:54:24 MSK
(In reply to comment #13)
> получил лог сельты... попробую что-нибудь
> откопать
Там ничего нет. Все запросы транслируются правильно. 
>при зависании процесс постгри что-то
>делает, видны select, fetch, declare cursor, move, delete, savepoint
Да в трассировке видно:
{call _1sp__1SJOURN_ByIDDOC('   1H  ')}
{call _1sp_SC16_ByID('   1A   ')}
Select * from CJPROP(NOLOCK) where CJID=447
Select * from CJ447(NOLOCK INDEX=IDRECALC) where IDRECALC='ZIJYGT  ' order by IDRECALC,ROW_ID\ 0

Этот запрос готовит но не выполняет. Наверное потому, что в предыдущем ему вирнулось NODATA
Select COUNT(*) from CJ447(NOLOCK) where IDRECALC=? and ROW_ID<=?\ 0
Delete from CJ447 where  ROW_ID=221

и затем заново. Попробую завтра повторить все, что делает 1с в этом цикле, может найду отличия. 



Comment 16 Калюхович Юрий 2009-03-26 16:59:27 MSK
итак ход действий 1с:
создаем курсор , в данных имеем 10 строчек, и вызываем SQLFetchScroll с параметром SQL_FETCH_FIRST нужное количество раз
вот тут начинается разница между постгри и ms:
в ms каждый раз получаем следующую строчку, таким образом перебирая все 10 записей,
а в постгри - каждый раз получаем только ПЕРВУЮ, отчего и происходит зависание

в постгри каждый раз курсор пересоздается с тем же набором данных, отчего и получаем одну и ту же запись. осталось выяснить, что делает ms с курсорами...
Comment 17 Станислав Коробейников 2009-03-26 18:42:32 MSK
Конкретизирую проблему:
Что происходит: 
ms sql:
1. Открывает курсор (Select * from CJ447 where IDPARDOC=?)
2. Тащит запись SQL_FETCH_FIRST
3. Удаляет запись (Delete from CJ447 where  ROW_ID=?)  (туже запись)
Повторяет 2,3, пока не закончится курсор.

pgslq:
Все тоже самое, но при повторном (и так далее) SQL_FETCH_FIRST он получает туже саму запись, которая должна была быть удалена. Удаляет ее еще раз, получает 
"with return code 100 (SQL_NO_DATA_FOUND)" (ничего не удалилось, еще бы уже разок ее удаляли) -- не смущается а продолжает дальше. Курсор само сабой никогда не заканчивается. 

Я написал тестовую програмку. Записи нормально удаляются, похоже не обновляется курсор. 

 


Comment 18 Станислав Коробейников 2009-03-26 18:52:19 MSK
У нас по каким-то причинам, которые я пока не понял, обновляются только курсоры со свойством :
SQL_ATTR_CONCURRENCY SQL_CONCUR_READ_ONLY
А тут нету такого свойства у курсора. 
Надо подумать, почему в SELTA так сделано. 
Comment 19 Калюхович Юрий 2009-03-27 10:56:29 MSK
*** Bug 2191 has been marked as a duplicate of this bug. ***
Comment 20 Станислав Коробейников 2009-03-27 11:32:43 MSK
(In reply to comment #18)
> У нас по каким-то причинам, которые я пока
> не понял, обновляются только курсоры со
> свойством :
> SQL_ATTR_CONCURRENCY SQL_CONCUR_READ_ONLY
> А тут нету такого свойства у курсора. 
> Надо подумать, почему в SELTA так сделано. 

Это была неправильная мысль. Свойство SQL_CONCUR_READ_ONLY по умолчанию.
Курсор нормально нами создавался, но не обновлялся, обновлялись курсоры только когда вызывается SQL_FETCH_RELATIVE, а SQL_FETCH_NEXT, SQL_FETCH_PRIOR, SQL_FETCH_FIRST, SQL_FETCH_LAST.
Непонятно, почему считалось, что их не надо обновлять. Очевидно надо. 



Comment 21 Станислав Коробейников 2009-03-27 11:55:34 MSK
(In reply to comment #20)
>обновлялись курсоры только
> когда вызывается SQL_FETCH_RELATIVE, а SQL_FETCH_NEXT,
> SQL_FETCH_PRIOR, SQL_FETCH_FIRST, SQL_FETCH_LAST.
> Непонятно, почему считалось, что их не надо
> обновлять. Очевидно надо. 

Сделал что бы обновлялись курсоры при всех этих вызовах. Все работает.