gifts2017

Удаление сотен тысяч документов за несколько часов из УТ11

Опубликовал Дмитрий Никс (aximo) в раздел Управление - Пользователю системы

Делюсь своим опытом по удалению относительно большого количества документов (> 300 тыс) из управленческой базы УТ 11 за 7 часов.

Цель: разработать алгоритм массового удаления больших количеств документов из УТ 11 без потери ссылочности базы.

 

Мои действия (операции на серверной базе):

1. Я написал программу, которая позволяет определить количество "задействованных" типов документов в текущей базе, их соответствие таблицам sql.

программу можно посмотреть (скачать)  http://infostart.ru/public/310610/

запустив программу, я вижу, что в базе более 300 тыс документов, их соответствие таблицам sql, а также таблицы регистров, по которым делают движения задействованные документы базы.

 

2. Делаю такой ход: удаляю все регистры накопления у типов документов, количество которых больше 30000 шт.

В моем случае это документы - ПеремещениеТоваров, ЗаказКлиента, Реализация, ПКО.

 

Для физического удаления регистров, я воспользовался sql запросом из базы 1с, он может быть, например, таким:

 

    СтрПодключения = "Provider=SQLOLEDB.1;Password=" + Пароль + ";Persist Security Info=True;Context connection=true;User ID="
    + Пользователь + ";Initial Catalog=" + База + ";Data Source=" + Сервер;
	
    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.ConnectionString =  СтрПодключения;
    Connection.CommandTimeout = 600;
	
    Попытка
        Connection.Open();
		Сообщить("Подключено!");
    Исключение
      	Connection = Неопределено;
		Сообщить(ОписаниеОшибки());
		Возврат;
 	КонецПопытки;
	
	Запрос = Новый COMОбъект("ADODB.Recordset");
	Запрос.Activeconnection = Connection;
	
	Для Каждого Стр1 ИЗ Объект.ТаблицаСоответствия Цикл
	
		ТекстЗапроса = "DELETE FROM dbo._"+Стр1.ИмяВТаблицеБД;
		
		Попытка
			Запрос.Open(ТекстЗапроса);
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;
	
	КонецЦикла;
	
	Connection = Неопределено;	
	Сообщить("Выполнено!");	

 

Время выполнения запросов по удалению регистров накопления по моим выбранным документам составило примерно 7 - 10 минут. 


Захожу в "Движения документов" - вижу, что движений нет. Сработало все чисто.

 

3. Теперь, нужно "доочистить" все документы от оставшихся движений, пометив их на удаление (отмена проведения). Для этого, я написал вот эту программу

http://infostart.ru/public/310737/

Запускаю, обработку. Распроведение всех документов составила приблизительно 2 часа.

В результате, я имею все документы базы помеченные на удаление и без движений.

 

4. Последним шагом я физически удаляю документы из базы, запустив такой скрипт

 

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

Все физическое удаление (по счетчику секунд) - у меня составило приблизительно 5 часов.

После завершения удаления - делаю проверку базы ТИИ - битых ссылок не обнаружил. Все документы удалены.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Канат Джумадылов (Fox-trot) 08.11.14 10:52
По четвертому пункту. Раз уж выбрал технологию ADO, то имхо и нужно было выжимать из нее по максимуму. Документы мона удалять по уже установленному реквизиту _Marked = 1, а для подчиненных таблиц = табличных частей использовать что-то типа
DELETE FR OM _Document218_VT4768 WHERE (_Document218_IDRRef IN (SEL ECT _IDRRef FR OM _Document218 WH ERE (_Marked = 1)))

Получилось бы на порядок быстрее. Я гарантирую это =)
2. Дмитрий Никс (aximo) 08.11.14 11:49
(1) согласен, но времени бы на подготовку-написание ушло бы больше
3. Александр (Иной) 08.11.14 23:18
А может стоило бы посмотреть в сторону планов обмена или конвертации данных?
Решение достаточно рискованное, в плане целостносности. И вопрос остатков не раскрыт...
4. Марина Семёнова (SemenovaMarinaV) 09.11.14 15:38
5. Сергей (necropunk) 10.11.14 15:51
Но не очень понял код удаления из регистров - целиком регистры грохали или как? Не вижу отбора по документу, и, что такое Объект.ТаблицаСоответствия? На форме что-то? Вообще, наверное, давно пора написать нормальную обработку, которая по запросу будет брать список документов, получать имена регистров куда они пишут данные, чистить с отбором по ссылке, а потом и сами документы грохать.
6. Марина Семёнова (SemenovaMarinaV) 10.11.14 17:53
Согласна, хотелось бы универсальную обработку
7. Сергей (Che) Коцюра (CheBurator) 10.11.14 20:34
ну вообщем-то надо чистить и журналы?
документы могут также преспокойненько упоминаться в реквизитах справочников.. (не знаю как в типовых, а вообщем - не запрещено).
.
универсальную вещь будет написать сложно.
8. Дмитрий Никс (aximo) 10.11.14 21:14
(7) журнал чистятся в распроведении документов. бог миловал - в моем случае в реквизитах справочников документы не упоминаются. И это подтвердило ТИИ - битых ссылок не обнаружено

какая должна быть универсальная обработка? на все надо время просто, которого как всегда нет.
9. Alexei Zhovner (jan27) 11.11.14 08:36
(1) удаление происходит медленнее, чем truncate. Если удаляемых документов больше чем нужно оставить, проще сделать копию таблицы, очистить её truncate, а затем скопировать нужные строки из первоначальной таблицы
ojiojiowka; +1 Ответить 1
10. Дмитрий Никс (aximo) 11.11.14 09:31
(9) jan27, да кто против - делай. вопрос времени. процесс удаления регистров через delete 10 минут... выигрыш на фоне остального процесса - 7 часов - сомнителен.
11. Anton Dunaev (dunaev.anton) 13.11.14 01:01
в чем смысл всей затеи ? оставить только справочники и т.д. все кроме документов и их движений ?

элементарно решается через план обмена - через создание подчиненного узла , состав которого можно полностью контролировать
12. Андрей Вовк (wowkai) 14.11.14 23:52
Интересный метод. я бы еще "тестирование и исправление" запустил.
13. Никита Коротаев (bforce) 29.11.14 22:35
(0), рекомендую посмотреть в сторону инструкции TRUNCATE вместо DELETE. Заметите существенную разницу при очистке больших таблиц.

Непонятно, зачем нужен пункт 3. У вас документы куда-то пишут в независимые регистры? Зачем их распроводить, вы ведь и так все движения уже "убили"?

Документы с табличными частями в пункте 4 тоже надо было удалять средсвами SQL, иначе нет смысла смотреть вообще в его сторону.
Я могу вам набросать маленький скрипт, который выплит разом все записи документов, их табличных частей и регистров. А так получается очень сомнительный симбиоз.

А, вообще, зачем все это? Не проще загрузить из dt чистую базу и перенести настройки учетной политики, константы и что-то нибудь еще нужное в чистую базу?

(7), чистить еще много чего придется, например, последовательности, таблицы регистрации изменений, регистры заточенный под обмены данными, предметы взаимодействий, да мало ли чего еще там написано.
ojiojiowka; alexscamp; jan27; +3 Ответить
14. Алексей (alexscamp) 28.12.14 19:34
"без потери ссылочности базы"... не знаю что такое ссылочность базы, наверное все-таки опечатка, но даже так этот пункт не выполнен и он критичен - контроля ссылочной целостности тут нет, пожалуйста, не вводите людей в заблуждение, вдруг кто-то не прочтет комментариев и будет использовать у себя. То, что на вашей конкретной базе ТиИ не показало битых ссылок - частность (т.е. - повезло).
"удаляю все регистры накопления", "Для физического удаления регистров" - пока не разглядишь "delete from", совершенно не понятно, что имелось ввиду. Кажется, что вы их в конфигураторе решили удалить, или прямо "физически" из БД, типа "drop table"... тоже можно конечно считать что опечатка или придирка к формулировке, но вводит в заблуждение второй раз.
Ну и самое главное конечно - truncate а не delete, и не раскрыта тема остатков, про которые уже выше упомянули. Идеи неплохи и правильны, но с кучей оговорок, которых тут нет.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа