Имя: Пароль:
1C
1С v8
v8: как програмно удалить много элементов справочника
0 vde69
 
25.10.12
15:25
имеем справочник с парой лямов элементов, нужно удалить 500 000 записей (отбор по владельцу), как это сделать быстро? (быстро это менее 1 часа)

сейчас например для файловой базы идет вообще около суток, на скуле 6 часов.

Интересует какой нибудь хитрый способ реализуемый кодом самой 1с (без всяких удалений метаданных)
1 hhhh
 
25.10.12
15:28
порциями удалять, разбить на транзакции по 1000 штук.
2 1Страх
 
25.10.12
15:29
на скуле delete
3 Повелитель
 
25.10.12
15:29
Обмен данными, Загрузка = Истина; убыстрит чуток, а так средствами 1с никак наверно.
Играя с количеством элемнтов в транзакции можно добиться прироста скорости еще.
4 vde69
 
25.10.12
15:29
(1) это сейчас так и сделано
5 acsent
 
25.10.12
15:30
транзакции в 8 никак не ускоряют работу
6 almar
 
25.10.12
15:30
(0) А зачем быстро?
7 Kashemir
 
25.10.12
15:31
Кроме скулевого удаления ничего такого вроде не придумаешь.
8 hhhh
 
25.10.12
15:32
(5) ну когда я удалял, то мне помогло. Есть же разница - 500 транзакций или 500000 транзакций.
9 Kashemir
 
25.10.12
15:33
+(7) Если нет табличных частей и реквизитов неограниченной длины.
10 Liova
 
25.10.12
15:33
А что, такое часто надо делать? Или удалять не всё сразу не вариант?

При удалении ещё и записи в РС с ведущими измерениями делаются.
11 Повелитель
 
25.10.12
15:33
(8) Помню на 7-ке такое прокатывало, производительность в несколько раз вырастала ))
А вот на 8, если 10-20% выйгрываю этими манипуляциями то рад ))
12 Kashemir
 
25.10.12
15:34
(10) Да вроде автор не озадачивается проблемой контроля ссылочной целостности
13 hhhh
 
25.10.12
15:35
для файловой лучше в терминале удалять, чтобы прямо на сервере, без сети.
14 Kashemir
 
25.10.12
15:36
+(13) и в привилегированном модуле, дабы всякие рлсы не трогать
15 МихаилМ
 
25.10.12
15:36
используйте фоновые задания.
причем кол-во фоновых мб в 2-3 раза больше, чеи доступных процессеров(ядер.)
16 Reset
 
25.10.12
15:36
Журнал регистрации отключить на время удаления (хотя это копейки наверное)
17 Liova
 
25.10.12
15:37
(12) Я вообще к тому, что надо смотреть не только на сам справочник. но и как пишется в РС записи, и что по подписке делается.
Например, может есть подписка для плана обмена, тогда (3) может сильно помочь.

(15) + 1 имел ввиду когда спрашивал (10)
18 Pro-tone
 
25.10.12
15:38
19 nv24
 
25.10.12
15:59
хороший вопрос
20 vde69
 
25.10.12
16:21
вроде заработало нормально, как я понял раньше тормозило на поиске "деток" (по родителям), после установки загрузки стало на порядок быстрее.

Функция ОчиститьДампБлоковФайла(Файл, ОсталосьБлоков, ВсегоБлоков) Экспорт
   Результат = Истина;
   УстановитьПривилегированныйРежим(Истина);
   
   КоличествоБлоков = 1000;
   
   // очищаем старые значения
   // наверно более оптимально будет использовать старые,
   // но это в преспективе
   
   Запрос = Новый Запрос(
   "ВЫБРАТЬ РАЗЛИЧНЫЕ
   |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Блоки.Ссылка) КАК Ссылка
   |ИЗ
   |    Справочник.Блоки КАК Блоки
   |ГДЕ
   |    Блоки.Владелец = &Владелец ");
   
   Запрос.УстановитьПараметр("Владелец", Файл);
   
   мТЗ = Запрос.Выполнить().Выгрузить();
   ОсталосьБлоков = мТЗ.Итог("Ссылка");
   ВсегоБлоков = Макс(ВсегоБлоков, ОсталосьБлоков);
   
   Запрос.Текст =
   "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ  " + Формат(КоличествоБлоков, "ЧГ=0") + "
   |    Блоки.Ссылка
   |ИЗ
   |    Справочник.Блоки КАК Блоки
   |ГДЕ
   |    Блоки.Владелец = &Владелец  ";
   
   
   Выборка = Запрос.Выполнить().Выбрать();
   
   Если Выборка.Количество() >= КоличествоБлоков Тогда
       Результат = Ложь;
   КонецЕсли;
   
   НачатьТранзакцию();
       Пока Выборка.Следующий() Цикл
           оОбьект = Выборка.Ссылка.ПолучитьОбъект();
           оОбьект.ОбменДанными.Загрузка = Истина;
           оОбьект.Удалить();
       КонецЦикла;
   ЗафиксироватьТранзакцию();
   
   УстановитьПривилегированныйРежим(Истина);
   Возврат Результат;
КонецФункции
21 ilya_i
 
25.10.12
17:16
Возможно удаление каких-нибудь индексов ускорило бы, но не уверен ...