![]() |
|
Как ускорить код | ☑ | ||
---|---|---|---|---|
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
|
что-то типо такого : v8: быстрая очистка регистра бухгатерии
|
|||
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) Ща отладчиком пробежал, достаточно один раз вне цикла :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |