Имя: Пароль:
1C
1С v8
Возможно ли ускорить удаление записей регистра?
0 bodri
 
02.06.15
11:44
Возможно ли ускорить удаление записей регистра?

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Типовой.Регистратор КАК Регистратор,
    |    Типовой.Сумма КАК Сумма
    |ИЗ
    |    РегистрБухгалтерии.Типовой КАК Типовой
    |ГДЕ
    |    Типовой.Период <= &Дата
    |
    |УПОРЯДОЧИТЬ ПО
    |    Типовой.Период
    |ИТОГИ
    |    СУММА(Сумма)
    |ПО
    |    Регистратор";
    
    Запрос.УстановитьПараметр("Дата",Дата);
    
    Результат = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        
    Пока Результат.Следующий() Цикл
        
        Операция = РегистрыБухгалтерии.Типовой.СоздатьНаборЗаписей();
        Операция.Отбор.Регистратор.Установить(Результат.Регистратор);
        Операция.Прочитать();
        
        Если Не Операция.Количество() = 0 Тогда
            Операция.Очистить();
            Операция.Записать();
        КонецЕсли;
        
    КонецЦикла;
1 ДенисЧ
 
02.06.15
11:45
Не надо Операция.Прочитать()
2 pessok
 
02.06.15
11:45
итоги в заросе не нужны, сумма в запросе не нужна, набор не нужно читать и очищать перед записью
3 Волшебник
 
модератор
02.06.15
11:46
убери  Операция.Прочитать();
4 bodri
 
02.06.15
11:47
(2) итоги нужны, выводится еще табличка.
5 1Сергей
 
02.06.15
11:47
перенеси до цикла строку
Операция = РегистрыБухгалтерии.Типовой.СоздатьНаборЗаписей();

ускорит на 0,000000000001%
6 Волшебник
 
модератор
02.06.15
11:48
Можно создать новый регистр бухгалтерии и перенести в него записи >&Дата
Старый регистр переименовать в Удалить_
7 Ненавижу 1С
 
гуру
02.06.15
11:48
Пока Результат.Следующий() Цикл
        
        Операция = РегистрыБухгалтерии.Типовой.СоздатьНаборЗаписей();
        Операция.Отбор.Регистратор.Установить(Результат.Регистратор);
        Операция.Записать();
        
        
    КонецЦикла;
8 pessok
 
02.06.15
11:49
(4) в цикле я этого не вижу
9 Волшебник
 
модератор
02.06.15
11:49
Запускать надо на 1С-сервере или так, чтобы между клиентом и сервером была гигабитная сетка.
10 bodri
 
02.06.15
11:49
(6) не так не пойдет, в базе 8 лет работы, а удалить надо первый год.
11 pessok
 
02.06.15
11:50
(10) это была шутка, мне кажется :)
12 bodri
 
02.06.15
11:50
(8) не буду же я всю процедурину суда впихивать
13 Волшебник
 
модератор
02.06.15
11:51
(11) Зависит от объёма данных и как его разделяет дата. Например, если надо удалить 8 лет работы и оставить последний год, то вполне имеет смысл создать новый регистр или новую базу
14 bodri
 
02.06.15
11:52
(13) согласен
15 Волшебник
 
модератор
02.06.15
11:53
(10) Кстати, остатки изменятся. Это предусмотрели?
16 pessok
 
02.06.15
11:53
(13) я бы все же снял активность с движений, дабы "не протерять", с другой стороны, в отдельном регистре они тоже не пропадут
17 bodri
 
02.06.15
11:53
(15) да
18 bodri
 
02.06.15
12:00
странно (7) работает медленней чем (0)
в (7) 112 записей в минуту, а в (0) 95 записей в минуту
19 bodri
 
02.06.15
12:01
(18) наоборот в (7) 95 записей в минуту, а (0) - 112
21 pessok
 
02.06.15
12:05
высказывание_Станиславского.txt
22 bolobol
 
02.06.15
12:07
(19) Да, оптимизация - она такая...
23 pessok
 
02.06.15
12:13
(0) давай замеры, надо смотреть где оно тупит
24 Гёдза
 
02.06.15
12:14
если массово, то отключить итоги, удалить в режиме обмен данными, потом пересчитать итоги
25 Гёдза
 
02.06.15
12:15
или удалять даже в чистом скл
26 Гёдза
 
02.06.15
12:16
у меня где-то была такая обработка свертки. но только для регистров накопления
27 pessok
 
02.06.15
12:17
кстати да, отключение итогов точно позволит ускорить обработку. ОбмегДанными.Загрузка - тут уже надо смотреть что там в самом модуле набора данных, может быть и не нужно
28 bodri
 
02.06.15
12:18
(23) Операция.Записать();
по (0) на 106 обращений 46,6 сек
по (7) на 101 обращений 50,5 сек
29 bolobol
 
02.06.15
12:18
(23) Отсутствие проверки на необходимость записи:
      Если Не Операция.Количество() = 0 Тогда
            Операция.Очистить();
            Операция.Записать();
      КонецЕсли;
- вызывает запись даже тогда, когда она не требуется.
Вопрос лишь в том - зачем отбирать регистраторы, по которым очищать нечего
30 pessok
 
02.06.15
12:20
(29) все дело в том, что в это условие входа тупо не будет, посему оно лишнее. Запрос же строится по регистру, значит по регистратору движения есть
31 bodri
 
02.06.15
12:22
(30) верно
32 bolobol
 
02.06.15
12:22
(30) глянь в (28) - 101 раз, вместо 106
33 bodri
 
02.06.15
12:23
46,6/106 = 0,44
50,5/101 = 0,5
34 bodri
 
02.06.15
12:23
(33) к (32) и + замер делался за минуту
35 pessok
 
02.06.15
12:25
(31) дык это не показатель, записи все равно обрабатываются одни и те же, просто, почему-то, после чтения и очистки удаляется веселее... Платформа...
36 bolobol
 
02.06.15
12:25
(34) Если разный набор удаляется - тогда и сравнивать нечего.
37 vogenut
 
02.06.15
12:27
НачатьТранзакцию();
    Пока Результат.Следующий() Цикл
        Операция = РегистрыБухгалтерии.Типовой.СоздатьНаборЗаписей();
Операция.Отбор.Регистратор.Установить(Результат.Регистратор);
        
        Операция.Записать();
    КонецЦикла;
    ЗафиксироватьТранзакцию();
38 pessok
 
02.06.15
12:28
+(37) как вариант может взлететь, а если еще и в начале транзакции отрубить итоги, то вообще может получиться хорошо. Грустнее, что это все гадание на кофейной гуще
39 z80a
 
02.06.15
12:28
(0) При чистке записей регистра нужно отключить пересчет итогов:

УстановитьИспользованиеИтогов(Ложь);

чистка

УстановитьИспользованиеИтогов(Истина);
40 vogenut
 
02.06.15
12:30
(38) Если очищается большая часть регистра, то можно отключить итоги. Транзакция всегда даст выигрыш.
41 Волшебник
 
модератор
02.06.15
12:30
Надо посмотреть модуль набора регистра, какие там проверки при записи и отключить их по условию ПараметрСеанса.ГрупповоеИзменениеОбъектов или ОбменДанными.Загрузка = Истина
42 pessok
 
02.06.15
12:31
(40) все были уверены, что непрочитывание набора тоже даст выигрышь, ан нет
43 ЧеловекДуши
 
02.06.15
12:32
(42) Ты тест проводишь при удалении одних и тех же данных.
Или попросту 100 первых попавшихся?

100 тогда, не будут 100 в следующем ;)
44 pessok
 
02.06.15
12:33
(43) я ничего не провожу, я только высказываю мнение, что может помочь автору, а потом буду использовать это у себя :)
45 bodri
 
02.06.15
12:37
(43) специально развернул 2 базы для проверки, поэтому по идее условия одинаковы
46 Fragster
 
гуру
02.06.15
12:37
(0) выключить итоги, выбрать регистраторов по месяцам, каждый месяц запустить в своем фоновом задании или в своем сеансе 1с
47 vogenut
 
02.06.15
12:37
(42) Набор все равно зачитывается, самой платформой.
48 Fragster
 
гуру
02.06.15
12:37
(46)+ ну, или по количеству ядер процессора
49 Fragster
 
гуру
02.06.15
12:39
ну и база должна быть клиент-серверной, и на сервере должны быть диски нормальные, а не один wd green 5400 оборотов
50 bolobol
 
02.06.15
12:42
(49) Думается, закупить нормальные диски для разовой операции - это не совсем адекватно)
51 Fragster
 
гуру
02.06.15
12:42
(50) ну вдруг там они уже стоят на сервере?
52 Мыш
 
02.06.15
12:43
Итоги отключить, несомненно.
53 Fragster
 
гуру
02.06.15
12:44
(51)+ вот в публикации http://catalog.mista.ru/public/173394/ как раз измеряется скорость записи наборов. какие красивые графики при увеличении количества параллельных сеансов.
55 Fragster
 
гуру
02.06.15
12:46
56 Волшебник
 
модератор
02.06.15
12:47
(46) да-да, всё нужно делать параллельно
57 pessok
 
02.06.15
12:50
(55) абсцисса - количество потоков?
58 bodri
 
02.06.15
12:52
Опытным путем добился следующих результатов за минуту действий
(0) + отключение итогов 531 обращение за 20,92 сек.
(7) + отключение итогов 715 обращений за 28,52 сек.
59 Fragster
 
гуру
02.06.15
12:53
(57) да
60 Fragster
 
гуру
02.06.15
12:54
интересно, там веб сервис обмена результатами еще работает?
61 hhhh
 
02.06.15
12:54
(58) ну ОбменДанными.Загрузка = Истина ставил?
62 Redkiy
 
02.06.15
12:58
(0) а сам запрос не обсуждается?
Для чего там группировки и лишние реквизиты (Сумма)?
63 pessok
 
02.06.15
13:00
(62) говорят, что надо :)
64 bodri
 
02.06.15
13:06
(62) -> (4)
65 vogenut
 
02.06.15
13:08
(58) Транзакцию пробовал?
66 pessok
 
02.06.15
13:08
(64) ну как, распараллелил?
67 bodri
 
02.06.15
13:11
(65) да, почти без результатов, по началу вроде шустро, но потом, после 10к записей сильное замедление, даже если разделять по количеству транзакция.


Всем спасибо за советы и обсуждение. Самый оптимальный для меня по времени, мой вариант с отключением итогов
68 pessok
 
02.06.15
13:12
(67) в потоках будет быстрее, но больше кода
69 bodri
 
02.06.15
13:14
(68) поподробней?
70 Fragster
 
гуру
02.06.15
13:16
(68) надо запустить несколько сеансов по разным периодам и все. если итоги не отключены - то еще разрешить разделение итогов, но лучше все-таки итоги отключить.
71 pessok
 
02.06.15
13:18
(69) разбить поквартально, запустить для каждого квартала свое фоновое задание по очистке
(70) можно и так, но красивее все же фоновыми
72 Zhuravlik
 
02.06.15
13:19
Почему-то никто не сказал про truncate в СУБД.
73 Zhuravlik
 
02.06.15
13:20
+ Или база файловая?
74 pessok
 
02.06.15
13:20
(72) посмотри на секцию ГДЕ в запросе
75 ЧеловекДуши
 
02.06.15
13:20
(69) Несколько фоновых заданий.
76 ДенисЧ
 
02.06.15
13:20
(72) Потому что большинство тех, кто знает о транкейте, догадывается, что им нельзя удалить только часть данных
77 pessok
 
02.06.15
13:22
но вообще, DELETE FROM Таблица WHERE Условие
78 Волшебник
 
модератор
02.06.15
13:23
(77) да ты гений
79 Zhuravlik
 
02.06.15
13:24
(76) я из меньшинства) Почему-то думал у него есть параметры.
(77) +1

На разл. обменах чистить тестовые РС - это ад просто, то-ли дело напрямую - пара секунд там, где 1С думает около часа...
80 pessok
 
02.06.15
13:27
от только 1С строго-настрого запрещает вручную ковыряться в таблицах
81 Fragster
 
гуру
02.06.15
13:28
(80) правильно. а то такие, как (79) фиганут данные, а потом за них ошметки вычищать
82 bodri
 
02.06.15
13:39
с отключением итогов тоже, что-то долго получается
без отключения 1,5 часа 1 квартал, с отключением 15 минут чистит и уже 30 минут включает итоги.
83 Fragster
 
гуру
02.06.15
13:40
(82) ну значит, для параллельного удаления не отключай итоги, а включай разделение итогов
84 Волшебник
 
модератор
02.06.15
13:43
(82) В чём проблема оставить на ночь? За 4 часа он всё удалит. Потом за 30 минут включишь итоги
85 bodri
 
02.06.15
13:46
(84) в принципе проблемы нет с включением на ночь, так и планировал сделать с рабочей базой.
86 Зеленый пень
 
02.06.15
13:48
Когда наконец 1С разрешит массовые операции над таблицами?
87 Волшебник
 
модератор
02.06.15
13:59
(85) Сделай ещё 8 сеансов на каждый год. Действуй.
88 Zhuravlik
 
02.06.15
14:03
(81) не надо про "такие как" - я бы не стал использовать не до конца понятный мне механизм в боевой базе. Сказал же - тестовые РС чистил. И можно узнать, о каких ошметках идет речь, если я чищу РС? Индексы?
89 Fragster
 
гуру
02.06.15
14:12
(88) регистрация изменений. бесконечное количество того, что выполняется в обработки ПередЗаписью и ПриЗаписи. для периодических РС и 8.3.5 - таблицы итогов.
90 Zhuravlik
 
02.06.15
16:00
(89) спасибо, действительно про планы обмена
91 Zhuravlik
 
02.06.15
16:00
не подумал)
Основная теорема систематики: Новые системы плодят новые проблемы.