Уменьшить количество записей в регистре сведений версии объектов.

1. user705522_constantin_h 36 26.03.18 09:38 Сейчас в теме
В регистре сведений версии объектов более 746 тыс. записей. Тестирование и исправление на платформе 8.3.11.2899 умирает на проверке этого регистра несколько дней идёт. Пробовал уменьшить количество записей (все убивать не хочу): отбор запросом для последующей выгрузки в таблицу значений и загрузку её в регистр сведений вываливается в ошибку недостаточно памяти. Как это можно сделать?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. TODD22 18 26.03.18 09:50 Сейчас в теме
(1)Я обработкой чистил. Она удаляет все версии кроме последних. Запускал на ночь. К утру выполнилось. Обработку с ИС брал. Но какую уже не помню.
2. DenisCh 26.03.18 09:48 Сейчас в теме
Определи критерий, по которому хочешь уменьшать. По этому критерию отбирай и чисти.
3. spezc 786 26.03.18 09:49 Сейчас в теме
6. user705522_constantin_h 36 26.03.18 11:13 Сейчас в теме
(2)Определил критерий:
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	версииобъектов.Объект КАК Объект,
	               |	версииобъектов.НомерВерсии КАК НомерВерсии,
	               |	версииобъектов.ВерсияОбъекта КАК ВерсияОбъекта,
	               |	версииобъектов.АвторВерсии КАК АвторВерсии,
	               |	версииобъектов.ДатаВерсии КАК ДатаВерсии,
	               |	версииобъектов.Комментарий КАК Комментарий,
	               |	версииобъектов.ТипВерсииОбъекта КАК ТипВерсииОбъекта,
	               |	версииобъектов.ВерсияПроигнорирована КАК ВерсияПроигнорирована,
	               |	версииобъектов.РазмерДанных КАК РазмерДанных,
	               |	версииобъектов.КонтрольнаяСумма КАК КонтрольнаяСумма,
	               |	версииобъектов.ЕстьДанныеВерсии КАК ЕстьДанныеВерсии,
	               |	версииобъектов.ВерсияВладелец КАК ВерсияВладелец,
	               |	версииобъектов.Узел КАК Узел,
	               |	версииобъектов.Синхронизируется КАК Синхронизируется,
	               |	версииобъектов.Смещение КАК Смещение
	               |ИЗ
	               |	РегистрСведений.ВерсииОбъектов КАК версииобъектов
	               |ГДЕ
	               |	версииобъектов.ДатаВерсии < &ДатаВерсии";
	Запрос.УстановитьПараметр("ДатаВерсии", Объект.ДатаВерсии);
	Выборка = Запрос.Выполнить().Выгрузить();
	Набор = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
	Набор.Загрузить(Выборка);
	
Показать

Выдаётся ошибка: недостаточно памяти.
9. DenisCh 26.03.18 11:41 Сейчас в теме
(6) По кускам удалять - вариант не рассматривается?
Например, даты в цикле по месяцу от начала времени?
15. user705522_constantin_h 36 26.03.18 12:29 Сейчас в теме
(9)Рассматривается всё. Только я не знаю, как это сделать.
16. DenisCh 26.03.18 12:38 Сейчас в теме
(15)например
Запрос.Текст = "ВЫБРАТЬ
                   |    версииобъектов.Объект КАК Объект,
                   |    версииобъектов.НомерВерсии КАК НомерВерсии,
                   |    версииобъектов.ВерсияОбъекта КАК ВерсияОбъекта,
                   |    версииобъектов.АвторВерсии КАК АвторВерсии,
                   |    версииобъектов.ДатаВерсии КАК ДатаВерсии,
                   |    версииобъектов.Комментарий КАК Комментарий,
                   |    версииобъектов.ТипВерсииОбъекта КАК ТипВерсииОбъекта,
                   |    версииобъектов.ВерсияПроигнорирована КАК ВерсияПроигнорирована,
                   |    версииобъектов.РазмерДанных КАК РазмерДанных,
                   |    версииобъектов.КонтрольнаяСумма КАК КонтрольнаяСумма,
                   |    версииобъектов.ЕстьДанныеВерсии КАК ЕстьДанныеВерсии,
                   |    версииобъектов.ВерсияВладелец КАК ВерсияВладелец,
                   |    версииобъектов.Узел КАК Узел,
                   |    версииобъектов.Синхронизируется КАК Синхронизируется,
                   |    версииобъектов.Смещение КАК Смещение
                   |ИЗ
                   |    РегистрСведений.ВерсииОбъектов КАК версииобъектов
                   |ГДЕ
                   |    версииобъектов.ДатаВерсии < &ДатаВерсии";
Показать

и устанавливать дату с (СамаяМеньшаяДата) по (СамаяМеньшаяДата) + 1месяц, удалять.
Цикл повторять до достижения нужного
10. Octopus 338 26.03.18 11:46 Сейчас в теме
(6) ВЫБРАТЬ ПЕРВЫЕ 100
Повторять до готовности
19. independ 1538 26.03.18 12:53 Сейчас в теме
(6) а если попробовать на 64-разрядной версии 1С?
5. LavinVladik 221 26.03.18 11:09 Сейчас в теме
можно так

DELETE FR OM [dbo].[_Reference34755]
WH ERE CONVERT(DATE, _Fld34774) BETWEEN '20040301' AND '40170831'
11. user705522_constantin_h 36 26.03.18 12:06 Сейчас в теме
(5)Можно по подробнее?
(5)
BETWEEN '20040301' AND '40170831'

Это какие даты?
12. LavinVladik 221 26.03.18 12:09 Сейчас в теме
(11)

все от формата хранения зависит , посмотри через SELECT
у меня 40170831 это 2017 год 08 месяц 03 день
14. user705522_constantin_h 36 26.03.18 12:28 Сейчас в теме
(12)Это из MS SQL надо делать?
7. Synoecium 781 26.03.18 11:30 Сейчас в теме
Если "DELETE FROM" выполняется слишком долго, есть вариант через "TRUNCATE" - создать временную таблицу в SQL, скопировать туда записи по условию, почистить основную таблицу регистра сведений(выполняется мгновенно) и скопировать сохраненные записи назад.
8. Synoecium 781 26.03.18 11:33 Сейчас в теме
А вообще автор не уточнил, может у него файловая ИБ, тогда лучше последовательно удалять записи в цикле(через менеджер записи), пока все ненужное не будет удалено.
13. user705522_constantin_h 36 26.03.18 12:27 Сейчас в теме
(8)База файловая.
Был вариант:
	Набор = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
	Набор.Прочитать();
	Индекс = 0;
	Пока Индекс <= Набор.Количество()-1 Цикл
		Запись = Набор.Получить(Индекс);
		Если Запись.ДатаВерсии < Объект.ДатаВерсии Тогда
			Набор.Удалить(Индекс);
		КонецЕсли;
		Индекс = Индекс + 1;
	КонецЦикла;
	Набор.Записать();
Показать


Тоже вываливался с ошибкой: недостаточно памяти.
17. LavinVladik 221 26.03.18 12:41 Сейчас в теме
(13) загрузи SQL, почти один миллион записей, тяжеловато для файловой.

либо получай записей из регистра запросом порциями по 5000

ВЫБРАТЬ ПЕРВЫЕ 5000

только условие добавь за период

и в цикл загони ПОКА Выборка .Количество>0

примерно так

 //Выберем всех регистраторов регистра
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
        | УчетНоменклатуры.Регистратор
        |ИЗ
        | РегистрНакопления.УчетНоменклатуры КАК УчетНоменклатуры";
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    //Обойдем регистраторов
    Пока Выборка.Следующий() Цикл
        Сообщить("Изменение записей по регистратору: " + Выборка.Регистратор);
        //Для каждого регистратора выполним изменение набора записей
        НаборЗаписей = РегистрыНакопления.УчетНоменклатуры.СоздатьНаборЗаписей(); 
        НаборЗаписей.Отбор.Регистратор.Значение = Выборка.Регистратор;
        НаборЗаписей.Прочитать();
        Для каждого Запись Из НаборЗаписей Цикл
            Запись.Реквизит1 = "Тест";
        КонецЦикла;
        НаборЗаписей.Записать();
    КонецЦикла; 

Показать



(14) да это для MS SQL
18. Octopus 338 26.03.18 12:50 Сейчас в теме
Вы почему во всех примерах пытаетесь одним махом обработать все необходимые записи? Конечно на файловой базе выдаст ошибки при таких объемах. Удаляйте в цикле порционно, по 1000-2000 элементов.
20. user705522_constantin_h 36 26.03.18 16:43 Сейчас в теме
Сделал так:
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 30000
	               |	ВерсииОбъектов.ДатаВерсии КАК ДатаВерсии
	               |ИЗ
	               |	РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
	               |ГДЕ
	               |	ВерсииОбъектов.ДатаВерсии < &ДатаВерсии
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	ДатаВерсии";
	Запрос.УстановитьПараметр("ДатаВерсии", Объект.ДатаВерсии);
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл
		ОтборРС = Новый Структура("ДатаВерсии");
		ОтборРС.ДатаВерсии = Выборка.ДатаВерсии;
		ВыборкаРС = РегистрыСведений.ВерсииОбъектов.Выбрать(ОтборРС, );
		Пока ВыборкаРС.Следующий() Цикл
			ВыборкаРС.ПолучитьМенеджерЗаписи().Удалить();
		КонецЦикла;
	КонецЦикла;
Показать

Всем спасибо!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот