|
Как быстро очистить СУБД | ☑ | ||
---|---|---|---|---|
0
Sasha_H
21.03.12
✎
19:29
|
Пожалуйста только без пафоса и по существу.
Задача така необходимо удалить все документы, кроме тех по которым есть движения по договору определенного свойства. Я сделал так: для начала отобрал все документы которые необходимо удалить и начал помечать на удаление - ДОЛГО!!! просто документов в базе реально - МНОГО порядка 6 млн. пробовал удалять по движениям тож не быстро. Вот собственно как все делается: Процедура ПометитьНаУдаленияИОчиститьНаборы(ПометкаУдаления=Ложь) Если Прайс.Пустая() Тогда Предупреждение("Необходимо выбрать прайс, по которому не должны удалятся документы!"); Возврат; КонецЕсли; ЭлементыФормы.ИндикаторВсего.Значение = 0; ЭлементыФормы.ИндикаторТек.Значение = 0; Запрос = Новый Запрос("ВЫБРАТЬ | ЗначенияСвойствОбъектов.Объект |ИЗ | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов |ГДЕ | ЗначенияСвойствОбъектов.Свойство В | (ВЫБРАТЬ | Константы.VWGСвойствоПрайс | ИЗ | Константы) | И ЗначенияСвойствОбъектов.Значение <> &Прайс"); Запрос.УстановитьПараметр("Прайс",Прайс); РезЗапр = Запрос.Выполнить(); ВыборкаДоговора = РезЗапр.Выбрать(); ЭлементыФормы.ИндикаторВсего.МаксимальноеЗначение = ВыборкаДоговора.Количество(); Сч1 = ВыборкаДоговора.Количество(); НачатьТранзакцию(); СчетчикТранзакций=0; Состояние("Помечаются на удаление..."); Пока ВыборкаДоговора.Следующий() Цикл сч1=сч1-1; ЭлементыФормы.ИндикаторВсего.Значение = ЭлементыФормы.ИндикаторВсего.Значение+1; ОбработкаПрерыванияПользователя(); ЗапросКритерий = Новый Запрос("ВЫБРАТЬ | ДокументыПоДоговоруКонтрагента.Ссылка КАК ТекущийДокумент |ИЗ | КритерийОтбора.ДокументыПоДоговоруКонтрагента(&Значение) КАК ДокументыПоДоговоруКонтрагента |ГДЕ | (НЕ ДокументыПоДоговоруКонтрагента.Ссылка.ПометкаУдаления)"); ЗапросКритерий.УстановитьПараметр("Значение",ВыборкаДоговора.Объект); РезЗапрКрит = ЗапросКритерий.Выполнить(); ВыборкаПоДокументам = РезЗапрКрит.Выбрать(); ЭлементыФормы.ИндикаторТек.МаксимальноеЗначение = ВыборкаПоДокументам.Количество(); ЭлементыФормы.ИндикаторТек.Значение = 0; сч2= ВыборкаПоДокументам.Количество(); Пока ВыборкаПоДокументам.Следующий() Цикл сч2=сч2-1; СчетчикТранзакций=СчетчикТранзакций+1; ЭлементыФормы.ТекТаблица.Заголовок = ВыборкаПоДокументам.ТекущийДокумент.Метаданные().Синоним; ЭлементыФормы.ИндикаторТек.Значение = ЭлементыФормы.ИндикаторТек.Значение+1; ЭлементыФормы.ПредставлениеОбъекта.Заголовок = ВыборкаПоДокументам.ТекущийДокумент; ОбработкаПрерыванияПользователя(); УдаляемыйОбъект = ВыборкаПоДокументам.ТекущийДокумент.ПолучитьОбъект(); ДвиженияОбъекта = УдаляемыйОбъект.Движения; Если Не ПометкаУдаления Тогда Для каждого НаборДвижений из ДвиженияОбъекта Цикл ИмяТаблицы = НаборДвижений.Метаданные().Имя; Если ОбщегоНазначения.ПринадлежностьКлассуМетаданных("РегистрыНакопления",НаборДвижений.Метаданные()) Тогда НаборЗаписей = РегистрыНакопления[ИмяТаблицы].СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаПоДокументам.ТекущийДокумент); //НаборЗаписей.Прочитать(); НаборЗаписей.Записать(); ИначеЕсли ОбщегоНазначения.ПринадлежностьКлассуМетаданных("РегистрыСведений",НаборДвижений.Метаданные()) Тогда НаборЗаписей = РегистрыСведений[ИмяТаблицы].СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаПоДокументам.ТекущийДокумент); //НаборЗаписей.Прочитать(); НаборЗаписей.Записать(); ИначеЕсли ОбщегоНазначения.ПринадлежностьКлассуМетаданных("РегистрыБухгалтерии",НаборДвижений.Метаданные()) Тогда НаборЗаписей = РегистрыБухгалтерии[ИмяТаблицы].СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаПоДокументам.ТекущийДокумент); //НаборЗаписей.Прочитать(); НаборЗаписей.Записать(); КонецЕсли; КонецЦикла; КонецЕсли; Если ПометкаУдаления Тогда УдаляемыйОбъект.УстановитьПометкуУдаления(Истина); КонецЕсли; Если СчетчикТранзакций >= 200 Тогда Состояние("Запись транзакции...");ЗафиксироватьТранзакцию(); НачатьТранзакцию(); Состояние("Помечаются на удаление..."); СчетчикТранзакций=0; КонецЕсли; Состояние("Помечаются на удаление... "+СчетчикТранзакций); КонецЦикла; КонецЦикла; ЗафиксироватьТранзакцию(); ЭлементыФормы.ИндикаторВсего.Значение = 0; ЭлементыФормы.ИндикаторТек.Значение = 0; КонецПроцедуры |
|||
1
simol
21.03.12
✎
19:32
|
1) перенести в файловую
2) отключить итоги |
|||
2
МихаилМ
21.03.12
✎
19:39
|
с какой скоростью удаляются доки сейчас ?
|
|||
3
Sasha_H
21.03.12
✎
19:41
|
она уже трое суток стояла. Правда нюанс еще есть єта база как специфичная на САТА винте.
|
|||
4
Sasha_H
21.03.12
✎
19:43
|
как отключать итоги правильно и потом подключить обратно?
с учетом того, что обработина может упасть |
|||
5
werdin
21.03.12
✎
19:45
|
СУБД - Система Управления Базами Даных
wiki:Система_управления_базами_данных |
|||
6
Maxus43
21.03.12
✎
19:46
|
(5) 1с файловая не СУБД?
|
|||
7
Sasha_H
21.03.12
✎
19:47
|
єто не файловая, она на скуле
|
|||
8
Maxus43
21.03.12
✎
19:48
|
(7) тогда сабж некорректен)
|
|||
9
Sasha_H
21.03.12
✎
19:48
|
(5) бред малька
|
|||
10
Sasha_H
21.03.12
✎
19:50
|
(8) ага. согласен. имел ввиду одно написал другое.
|
|||
11
kod263
21.03.12
✎
19:50
|
простейший вариант:
1. сделать копию базы, выгрузить cf 2. удалить в конфигурации документ, сохранить изменения 3. загрузить cf 4. перенести из копии документы с договором определенного свойства с использование обработки XML между одинак конфигурациями |
|||
12
floody
21.03.12
✎
19:53
|
на рамдиск базу
|
|||
13
Sasha_H
21.03.12
✎
20:02
|
(12) секса много, эта база просто готовится для определенных целей и не требует потом к себе никакого быстродействия
|
|||
14
Sasha_H
21.03.12
✎
20:03
|
Отключил итоги - удаление пошустрее пошло, буду наблюдать
|
|||
15
Maxus43
21.03.12
✎
20:04
|
6 млн доков? количество в транзакции увеличь, 200 - мало. ставь 1000
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |