|
Возможно ли ускорить удаление записей регистра? | ☑ | ||
---|---|---|---|---|
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
|
не подумал)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |