![]() |
|
Нужен совет: как быстро удалить данные до датыХ в РС Версии объектов | ☑ | ||
---|---|---|---|---|
0
1Cpr
20.01.17
✎
11:59
|
Всем привет.
Учитывая, что в РС Версии объектов, у нас пишется очень много данных по изменениям, возникла необходимость его подчистить до определенной датыХ. Но вот проблема, он огромен, количество записей - почти бесконечность. База файловая КА 8.2 последняя доступная платформа 130. Подсчитать хотя бы количество записей, тоже не вариант, запрос зависает насмерть, отжирает всю память и мрет. У кого есть проверенные лично варианты удаления записей из РС, но так, чтобы это оперативно произошло, например не более 30 - 60 мин. Заранее спасибо за помощь. |
|||
1
1Cpr
20.01.17
✎
12:09
|
ап
|
|||
2
depthzer0
20.01.17
✎
12:24
|
Можно попробовать выгрузить всё что нужно начиная с датыХ, потом зачистить регистр полностью и загрузить обратно, то что выгрузили.
|
|||
3
Aleksey
20.01.17
✎
12:25
|
В типовой БП есть регламентное задание по очистки. Настрой расписание и пусть по ночам чистит
|
|||
4
Фрэнки
20.01.17
✎
12:37
|
интересно, что хранение самих версий объектов отделено от записей регистра. Поэтому нужно не просто так похерить записи в регистре, а удалять данные по ссылке. Не, быстро и только сам регистр - этого делать не желательно
|
|||
5
Вафель
20.01.17
✎
12:44
|
удалить регистр в конфигураторе, потом загузить изначальную конфу
|
|||
6
Evgueni
20.01.17
✎
13:42
|
ЗапросОчистка = Новый Запрос;
ЗапросОчистка.Текст = "ВЫБРАТЬ | ВерсииОбъектов.Объект, | ВерсииОбъектов.НомерВерсии, | ВерсииОбъектов.ВерсияОбъекта, | ВерсииОбъектов.АвторВерсии, | ВерсииОбъектов.ДатаВерсии |ИЗ | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов |ГДЕ | ВерсииОбъектов.ДатаВерсии >= &НачПериода | И ВерсииОбъектов.ДатаВерсии <= &КонПериода"; ЗапросОчистка.Параметры.Вставить("НачПериода",НачалоДня(ДатаОчистки)); ЗапросОчистка.Параметры.Вставить("КонПериода",КонецДня(ДатаОчистки)); Выборка = ЗапросОчистка.Выполнить().Выбрать(); НовыйНомерВерсии=1; Пока Выборка.Следующий() Цикл ВерсииОбъектов = РегистрыСведений.ВерсииОбъектов; МенеджерЗаписиИИО = ВерсииОбъектов.СоздатьМенеджерЗаписи(); МенеджерЗаписиИИО.Объект = Выборка.Объект; МенеджерЗаписиИИО.НомерВерсии = Выборка.НомерВерсии; МенеджерЗаписиИИО.Прочитать(); МенеджерЗаписиИИО.Объект = Справочники.Номенклатура.ПустаяСсылка(); МенеджерЗаписиИИО.НомерВерсии = НовыйНомерВерсии; МенеджерЗаписиИИО.ВерсияОбъекта = Неопределено; МенеджерЗаписиИИО.Записать(); НовыйНомерВерсии=НовыйНомерВерсии+1; КонецЦикла; НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Объект.Установить(Справочники.Номенклатура.ПустаяСсылка()); НаборЗаписей.Записать(); Но это не быстро, зато вроде правильно |
|||
7
Heckfy
20.01.17
✎
14:06
|
"Но вот проблема, он огромен, количество записей - почти бесконечность" - не верю. Ибо не вяжется с "База файловая". У файловой базы ограничение на размер внутренней таблицы 4 ГБ.
"Подсчитать хотя бы количество записей, тоже не вариант, запрос зависает насмерть, отжирает всю память и мрет" - Нефиг ссылки в запрос пихать. Вот так посчитает: Запрос=Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | КОЛИЧЕСТВО(*) КАК Кол |ИЗ | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов |ГДЕ | ВерсииОбъектов.Период <= &Период" ; Запрос.УстановитьПараметр("Период",ДатаХ); РезультатЗапроса=Запрос.Выполнить().Выбрать(); РезультатЗапроса.Следующий(); Сообщить(РезультатЗапроса.Кол); "например не более 30 - 60 мин" - при озвученном в топике не вариант. Где то нарыл, переделай под себя и запускай. Никому мешать не будет и просаживать по памяти не будет: ЕстьЗаписи=Истина; Пока ЕстьЗаписи Цикл Запрос=Новый Запрос; Запрос.Текст= "ВЫБРАТЬ ПЕРВЫЕ 10000 | ВерсииОбъектов.Объект, | ВерсииОбъектов.НомерВерсии, | ВерсииОбъектов.ВерсияОбъекта, | ВерсииОбъектов.АвторВерсии, | ВерсииОбъектов.ДатаВерсии, | ВерсииОбъектов.Комментарий, | ВерсииОбъектов.ТипВерсииОбъекта, | ВерсииОбъектов.ВерсияПроигнорирована, | ВерсииОбъектов.РазмерДанных, | ВерсииОбъектов.КонтрольнаяСумма, | ВерсииОбъектов.ЕстьДанныеВерсии |ИЗ | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов" ; Запрос.УстановитьПараметр("Период",СократитьПоДату); РезультатЗапроса=Запрос.Выполнить().Выбрать(); Если РезультатЗапроса.Количество()=0 Тогда ЕстьЗаписи=Ложь; Иначе Пока РезультатЗапроса.Следующий() Цикл МЗ=РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); ЗаполнитьЗначенияСвойств(МЗ,РезультатЗапроса,,); МЗ.Удалить(); КонецЦикла; КонецЕсли; КонецЦикла; |
|||
8
Azverin
20.01.17
✎
14:55
|
а я в КА 1.1 раз в полгода запускаю обработку по удалению одинаковых записей в РС "Версии объекта". процентов 20% удаляет каждый раз. чистить как ТС пока нет необходимости.
|
|||
9
1Cpr
20.01.17
✎
17:50
|
Всем спасибо!
Действительно быстро работает этот вариант: ////////получаем количество записей в РС до чистки Запрос=Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | КОЛИЧЕСТВО(*) КАК Кол |ИЗ | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов |ГДЕ | ВерсииОбъектов.ДатаВерсии <=&НачПериода" ; Запрос.УстановитьПараметр("НачПериода",НачалоДня(НачПериода)); РезультатЗапроса=Запрос.Выполнить().Выбрать(); РезультатЗапроса.Следующий(); Сообщить(РезультатЗапроса.Кол); ЕстьЗаписи=Истина; номерцикла=0; Пока ЕстьЗаписи Цикл номерцикла=номерцикла+1; Сообщить("начало обработки в этом цикле "+ТекущаяДата() +" ЦИКЛ № "+номерцикла); Запрос=Новый Запрос; Запрос.Текст= "ВЫБРАТЬ ПЕРВЫЕ 10000 | ВерсииОбъектов.АвторВерсии КАК АвторВерсии, | ВерсииОбъектов.Объект КАК Объект, | ВерсииОбъектов.ДатаВерсии КАК ДатаВерсии, | ВерсииОбъектов.НомерВерсии, | ВерсииОбъектов.ВерсияОбъекта, | ВерсииОбъектов.УдалитьСжато, | ВерсииОбъектов.Комментарий, | ВерсииОбъектов.ТипВерсииОбъекта, | ВерсииОбъектов.ВерсияПроигнорирована |ИЗ | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов |ГДЕ | ВерсииОбъектов.ДатаВерсии < &НачПериода" ; Запрос.УстановитьПараметр("НачПериода",НачалоДня(НачПериода)); РезультатЗапроса=Запрос.Выполнить().Выбрать(); Если РезультатЗапроса.Количество()=0 Тогда ЕстьЗаписи=Ложь; Иначе Пока РезультатЗапроса.Следующий() Цикл МЗ=РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); ЗаполнитьЗначенияСвойств(МЗ,РезультатЗапроса,,); МЗ.Удалить(); КонецЦикла; КонецЕсли; Сообщить("конец обработки в этом цикле "+ТекущаяДата()+" ЦИКЛ № "+номерцикла); КонецЦикла; отдельное спасибо (7) За 50 минут по выполнению выше описанного было удалено более 1 млн записей. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |