![]() |
|
v8: Свёртка базы: почему так долго чистит регистр "Хозрасчетный"? | ☑ | ||
---|---|---|---|---|
0
dave2000
23.07.13
✎
11:44
|
Есть база УПП на MS SQL Server 2005, поток документов в день небольшой: около 30-40 документов максимум! В начале этого года делал свёртку базы за 2008-й год. Создание документов остатков проходило быстро, движения по всем регистрам удалялись быстро, за исключением регистра бухгалтерии "Хозрасчетный", его чистка по времени занимала около 8-12 часов. Сейчас запустил свёртку 1 квартала 2009, думал пройдёт всё намного быстрее, но нет! Чистка регистра бухгалтерии занимает около 7-10 часов. Чего ж оно так долго-то? Мне кажется вручную удалять документы было бы намного быстрее, но это ведь не выход.
Когда открываешь диспечер задач, процесс sqlservr.exe что-то делает, загрузка около 80%. Может оно там таблицы пережимает, с места на место данные переставляет, и из-за этого так долго? В самой обработке "Свертка Информационной Базы 2.0" код чистки регистра выглядит так: Процедура сбУдалитьДвиженияПоРегиструСРегистратором(ТипОбъектаМД, ИмяРегистра, ДатаНачала, ДатаОкончания) Экспорт ДокументСсылка = Неопределено; СсылкаНач = Неопределено; ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 10000 | ДокументРег.Регистратор КАК Регистратор |ИЗ | " + ТипОбъектаМД + "."+ИмяРегистра+" КАК ДокументРег |ГДЕ | ДокументРег.Период >= &ДатаНач | И ДокументРег.Период <= &ДатаКон"; Пока Истина Цикл Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ДатаНачала)); Запрос.УстановитьПараметр("ДатаКон", ДатаОкончания); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Прервать; КонецЕсли; Строка = Результат.Выбрать(); Пока Строка.Следующий() Цикл СсылкаНач = Строка.Регистратор; Если ВРЕГ(ТипОбъектаМД) = "РЕГИСТРНАКОПЛЕНИЯ" Тогда НаборЗаписей = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей(); ИначеЕсли ВРЕГ(ТипОбъектаМД) = "РЕГИСТРСВЕДЕНИЙ" Тогда НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей(); ИначеЕсли ВРЕГ(ТипОбъектаМД) = "РЕГИСТРБУХГАЛТЕРИИ" Тогда НаборЗаписей = РегистрыБухгалтерии[ИмяРегистра].СоздатьНаборЗаписей(); Иначе сбСообщениеСвертки(НСтр("ru='Не известный тип объекта метаданных ';uk='Невідомий тип об`єкта метаданих '") + ТипОбъектаМД); Возврат; КонецЕсли; НаборЗаписей.Отбор.Регистратор.Установить(Строка.Регистратор); НаборЗаписей.Записать(); КонецЦикла; КонецЦикла; КонецПроцедуры Может можно как-то более оптимизировать данный код? |
|||
1
Maxus43
23.07.13
✎
11:55
|
Итоги отключи
|
|||
2
Maxus43
23.07.13
✎
11:55
|
или в транзакции делай, по тыще другой доков
|
|||
3
Vovan1975
23.07.13
✎
11:57
|
(1) думается мне - дело в итогах, этож регистр бухгалтерии...
|
|||
4
acsent
23.07.13
✎
11:58
|
(2) все 7 методы никак не можешь забыть?
|
|||
5
Maxus43
23.07.13
✎
12:00
|
(4) нормальный метод, лучше конечно итоги отключить
|
|||
6
fisher
23.07.13
✎
12:01
|
Дело однозначно в пересчете итогов, но сомневаюсь что их можно отключить безболезненно для работы обработки свертки. Она ж остатки тоже где-то снимает. Нужно четко выверенное вмешательство.
|
|||
7
fisher
23.07.13
✎
12:03
|
Хотя... Стопудов она их снимает ДО. Но на всяк пожарный я бы прошелся по алгоритму. Может, и еще какое шаманство есть.
|
|||
8
dave2000
23.07.13
✎
12:18
|
(1) (3) (6) (7) Посмотрел по коду, перед вызовом процедуры сбУдалитьДвиженияПоРегиструСРегистратором() есть такая строка:
РегистрыБухгалтерии[ТекСтрока.ОбъектМД].УстановитьИспользованиеИтогов(Ложь); Т.е. итоги отключаются, причина в чём-то другом. |
|||
9
Живой Ископаемый
23.07.13
✎
12:21
|
просто не надо его чистить, нужно завести документы остатков и перенести их в пустую базу.
|
|||
10
dave2000
23.07.13
✎
12:32
|
(9) там документы за 2009-2013 год, это действующая рабочая база, с неё нужно убрать старые периоды
|
|||
11
Maxus43
23.07.13
✎
12:33
|
существующий алгоритм уже не ускорить...
|
|||
12
Живой Ископаемый
23.07.13
✎
13:11
|
2(10) и как это отменяет то, что я сказал?
|
|||
13
Живой Ископаемый
23.07.13
✎
13:13
|
то есть либо ты из дейстующей базы "убрать старые периоды", что влечет за собой чистку РБ Хозрасчтеный.
Либо ты разворачиваешь пустую базу, и переносишь документы ввода остатков, созданные сверткой в нее. Есть версия, что вариант займет меньше времени. |
|||
14
dave2000
23.07.13
✎
13:14
|
(12) ты имеешь в виду, перенести не только все документы остатков, а и все рабочие документы 2009-2013?
|
|||
15
acsent
23.07.13
✎
13:15
|
(8) нужно еще
РегистрыБухгалтерии[ТекСтрока.ОбъектМД].УстановитьИспользованиеТекущихИтогов(Ложь); |
|||
16
Живой Ископаемый
23.07.13
✎
13:15
|
2(14) что такое рабочий документ 2009-2013? Это документ который имеет проводки и движения? Чувак, ты же чистишь их движения, то есть они перестанут быть рабочими
|
|||
17
dave2000
23.07.13
✎
13:28
|
(16) Ты не понял... чистятся только периоды до 2 квартала 2009, остальные документы остаются на месте, так была поставлена задача.
|
|||
18
Живой Ископаемый
23.07.13
✎
13:29
|
2(17) да, наверное не понял.. а зачем так делать?
|
|||
19
acsent
23.07.13
✎
13:31
|
(18) там может с 2003 года база
|
|||
20
Живой Ископаемый
23.07.13
✎
13:33
|
2(19) и тем не менее.. я бы попробовал перенести все документы с момента свертки в новую базу. вдруг это будет быстрее..
|
|||
21
Bober
23.07.13
✎
15:20
|
(0)
- Перед циклом создать набор записей и им одним пользоваться - убрать условия в цикле (все равно все идет в рамках обного регистра - Сделать переменную ЭлементОтбора = НаборЗаписей.Отбор.регистратор и в цикле с ним работать - отключить как уже говори выше итоги, но не забудь отключить и текущие итоги. Если в базе работают люди, то отключать итоги нельзя, только сделать период расчета итогов 00010101 и отключи текущие итоги. Запросы будут тормозить, но люди смогут работать. - далее можно через фоновое задание раскидать, одно задание - один регистр. |
|||
22
Bober
23.07.13
✎
15:23
|
(8) удаление движений по бух всегда идет туго, но в этом варианте случае думаю не хватает еще строки
УстановитьИспользованиеТекущихИтогов(Истина), так как при удалении все равно считаются итоги на 3999 год |
|||
23
Bober
23.07.13
✎
15:24
|
УстановитьПериодРассчитанныхИтогов('00010101')
И УстановитьИспользованиеТекущихИтогов(Ложь) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |