Имя: Пароль:
1C
1С v8
Как ускорить код
0 дущ
 
15.03.12
11:02
Сервер Xeon E5620 (16 лог ядер), ОЗУ 12 ГБ.
Винда Server 2008 R2 x64.
1С клиент-сервер, тоже x64
БД MS SQL 2008 R2 Enterprise x64
SQL Server Manager сообщает, что сама база 7,7 ГБ
Журнал - 10 ГБ

Конфа БГУ. Выполняю следующий код


       Запрос    = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
       |    Хозрасчетный.Регистратор
       |ИЗ
       |    РегистрБухгалтерии.Бюджетный КАК Хозрасчетный
       |ГДЕ
       |    Хозрасчетный.Период МЕЖДУ &НулевойПериод И &Период
       |
       |ДЛЯ ИЗМЕНЕНИЯ");
       
       Запрос.УстановитьПараметр("НулевойПериод", '00010101');
       Запрос.УстановитьПараметр("Период", Дата);
       
       СчетчикДокументов    = 0;
       РегистрНабор    = РегистрыБухгалтерии.Бюджетный.СоздатьНаборЗаписей();
       Выборка    = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.Прямой);
       НачатьТранзакцию();
       Пока Выборка.Следующий() Цикл
           ОтборРегистратор    = РегистрНабор.Отбор.Регистратор;
           ОтборРегистратор.Значение    = Выборка.Регистратор;
           ОтборРегистратор.Использование    = Истина;
           РегистрНабор.Записать(Истина);
           СчетчикДокументов    = СчетчикДокументов + 1;
           Если СчетчикДокументов % 1000 = 0 Тогда
               Состояние("Обработано " + СчетчикДокументов + " документов.");
               ЗафиксироватьТранзакцию();
               НачатьТранзакцию();
           КонецЕсли;
       КонецЦикла;
       ЗафиксироватьТранзакцию();


Т.е. стоит задача очистить движения по регистру определенных документов. Делаю это в транзакции по 1000 доков. И вот как-то это медленно происходит. Запрос выполняется быстро, а вот запись в регистр накопления - медленно. Как можно ускорить этот код?

Делал то же в файловой на том же оборудовании, там удаляется быстрее, часа за 3 система доходит до 40000 документов и ругается на "мало памяти", в Скуле на "мало памяти" не ругается, но вот 20000 документов обрабатывает уже 5 часов.

Как ускорить, может количество доков в транзакции поменять?
1 Maxus43
 
15.03.12
11:06
ОтборРегистратор    = РегистрНабор.Отбор.Регистратор;
           ОтборРегистратор.Значение    = Выборка.Регистратор;
           ОтборРегистратор.Использование    = Истина;
вместо этого -

РегистрНабор.Отбор.Регистратор.Установить(Выборка.Регистратор);
2 zak555
 
15.03.12
11:06
виртуальная таблица
3 golden-pack
 
15.03.12
11:07
(1) ускорит ?
4 Skylark
 
15.03.12
11:07
Тема интересная, примерно тоже самое происходит при проведении табеля в ЗУП - там тоже запись регистров и тоже очень долго.
5 Maxus43
 
15.03.12
11:07
|ДЛЯ ИЗМЕНЕНИЯ");
убери, толку 0 всё равно
6 Reset
 
15.03.12
11:07
(1) Быстрее то из-за этого не будет)
7 golden-pack
 
15.03.12
11:07
+(3) ускорит или укоротит ?
8 Maxus43
 
15.03.12
11:07
(3) нет, протсо правильней)
9 Reset
 
15.03.12
11:07
А зачем транзакция?
10 Maxus43
 
15.03.12
11:08
(9) а без неё тормозить ещё сильней будет
11 pumbaEO
 
15.03.12
11:08
Отключить итоги, удалять, включить итоги.  Расшифровка (2)
12 Reset
 
15.03.12
11:08
(11) +1
13 zak555
 
15.03.12
11:14
+ сгруппировать по регистратору
14 zak555
 
15.03.12
11:16
15 НЕА123
 
15.03.12
11:17
(13)
РАЗЛИЧНЫЕ не достаточно?
16 pumbaEO
 
15.03.12
11:18
(15) достаточно.
17 zak555
 
15.03.12
11:19
(15) медленнее работает
18 ptiz
 
15.03.12
11:20
Поможет только прямая очистка в SQL записей основной таблицы и таблицы субконто + пересчет итогов.
19 tdm
 
15.03.12
11:20
(0) вирутальную таблицу использовать;
ну  и еще "РегистрНабор.Записать(Истина);" - глянуть модуль этого регистра, может лишние проверки есть в обработчике ПередЗаписью(), подписки там поискать лишние и прочее что обрабатывается на этом этапе
20 pumbaEO
 
15.03.12
11:22
(17) [Запрос выполняется быстро, а вот запись в регистр накопления - медленно.]
(18) format c: тоже решение.
(19) +1 может еще какие проверки делает, но врядли.
21 zak555
 
15.03.12
11:23
(20) так если отключить итоги
22 Maxus43
 
15.03.12
11:24
РегистрНабор.Обменданными.загрузка = Истина;
РегистрНабор.Записать();
:)
23 tdm
 
15.03.12
11:24
+ (19) как-то стояла задача перезаписать справочник с 700к элементов разово - выгонял всех,тупо коментил модуль справочника, перезаписывал откатывал назад =) гдет 5-ти кратное ускорение было
...правда если напрямую скулем делать вообще минуты - но это считается некошерно))
24 дущ
 
15.03.12
11:27
По замеру самая тяжелая строка это РегистрНабор.Записать(Истина);, т.е. на запрос я не жалуюсь, проблема именнов записи регистра.
(11) Спасибо. Вариант.
(22) Спасибо. Вариант.
25 Maxus43
 
15.03.12
11:29
(24) в (11) - 100% вариант, в (22) - обход проверок, если имеют место они быть в модуле
26 Maxus43
 
15.03.12
11:34
(24) офф: о, вязьма) я там служил
27 дущ
 
15.03.12
11:34
Вопрос тут возник, по варианту в (22) ОбменДанными.Загрузка = Истина нужно внутрь цикла втулять, или достаточно перед выполнением цикла один раз установить?
28 Maxus43
 
15.03.12
11:35
(27) 1 раз, где создание набора записей
29 Maxus43
 
15.03.12
11:35
(28) + блин, не факт. отладчиком проверить надо
30 дущ
 
15.03.12
11:38
Вот и я думаю, при установке отбора не сбрасывает ли он его в Ложь.
31 Maxus43
 
15.03.12
11:39
(30) в цикл засунь, это в худшем случае 0,001% времени будет)
32 дущ
 
15.03.12
11:43
(31) Ща отладчиком пробежал, достаточно один раз вне цикла :)