bdd2

Влияние режима удаления движений на производительность

Опубликовал Андрей Бурмистров (Andreynikus) в раздел Администрирование - Оптимизация БД (HighLoad)

Статья навеяна одним хитрым вопросом, который иногда задают на экзамене 1С Эксперт.
Вопрос звучит примерно так: «Чем опасен режим удаления движений «Удалять автоматически?»

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

А все на самом деле очень просто.

Если у документа установлен режим удаления движений «Удалять автоматически», то при перепроведении этого документа, еще до выполнения процедуры ОбработкаПроведения, движения будут удалены.

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

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

Рассмотрим пример.

Допустим у нас есть некий документ, который делает движения по одному регистру.

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

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

 

Оранжевым цветом, закрашены этапы, на которых данные буду блокированы.

На схеме видно, что во втором случае, данные будут заблокированы на гораздо меньшее время, чем в первом. А чем меньше длится блокировка, тем меньше вероятность возникновения проблем при многопользовательской работе.

См. также

Добавить вознаграждение
Комментарии
1. Петр (peterxx) 27.09.13 09:21 Сейчас в теме
Да почему бы и нет. Ликбез нужен, без него никак.
2. Владислав Рожевский (vvr908) 343 29.09.13 13:35 Сейчас в теме
В таком случае возникает ламерский вопрос - а зачем вообще нужен режим "Удалять автоматически"?
3. Роман Ложкин (webester) 21 30.09.13 07:20 Сейчас в теме
(2) Потому что этого может требовать логика приложения а так же для обеспечения совместимости. В модуле обработки проведения "Длительных вычислений и прочих действий" может и не быть.
С любовью, всегда ваш Кэп.
dimisa; bulpi; +2 Ответить
4. Василий Казьмин (awk) 665 30.09.13 18:57 Сейчас в теме
(1) peterxx, Нужен, но тема не до конца раскрыта. Была бы раскрыта вопроса (2) не было бы.
5. Dima Neumoichev (Ndochp) 95 02.10.13 09:57 Сейчас в теме
Забыт еще один момент - при перезаписи в регистр набора, совпадающего с уже записанным фактической записи не происходит.
То есть при перерпроведении с "удалять автоматически" для какого-нибудь крупного документа сначала запишется пустой набор, потом снова все его движения, а при записи движений "поверх" старых движений есть шанс, что СУБД вообще дергаться не будет.
6. Роман Ложкин (webester) 21 03.10.13 06:47 Сейчас в теме
(5)Я бы сказал, ключевой момент, который вроде бы вытекает из повествования, но не очевиден.
7. Андрей Бурмистров (Andreynikus) 619 08.10.13 12:58 Сейчас в теме
(5)
при перерпроведении с "удалять автоматически" для какого-нибудь крупного документа сначала запишется пустой набор, потом снова все его движения

Так и есть, только это будет действовать не только для крупных документов, а вообще для всех :)

а при записи движений "поверх" старых движений есть шанс, что СУБД вообще дергаться не будет

Опишите ситуацию при которой СУБД не будет удалять и перезаписывать движения если установлен режим "Удалять автоматически"
На моих тестах удаление происходит всегда.
8. Андрей Бурмистров (Andreynikus) 619 08.10.13 13:04 Сейчас в теме
(6)
Ключевой момент в том, что записи будут блокированы для удаления в самом начале проведения, что не есть хорошо.
9. Dima Neumoichev (Ndochp) 95 08.10.13 14:39 Сейчас в теме
(7) Andreynikus,
а при записи движений "поверх" старых движений есть шанс, что СУБД вообще дергаться не будет

Опишите ситуацию при которой СУБД не будет удалять и перезаписывать движения если установлен режим "Удалять автоматически"

Так я и сравниваю "удалять автоматически" и нет, как и в статье. Если "удалять автоматически" стоит, то очистка идет всегда и обойтись без перезаписи в СУБД шансов нет.

Про большие документы я хотел написать, что у них даже удаление движений долго идет, не то что формирование. Но как-то передумал в процессе написания поста.
10. andrey dyak (dyak84) 17.10.13 16:57 Сейчас в теме
Да все что можно удалить нужно закрить от простых и смертеных пользователей чем подальше, а то потом глюков не оберешся,а туту еще чтото удаляется автоматически етот факт заставляет задуматся что в базе на 200 пользователей размером 300 гб кто и чтото автоматически почнет удалять про какую производительность идет речь
11. Poison Angel (Poison Angel) 03.07.15 15:00 Сейчас в теме
(5) Ndochp, вот сейчас на фактических данных проверил:
- провел документ. режим удаления движений "Удалять автоматически при отмене проведения."
- выбрал в документе ещё раз то же самое значение в реквизите таб. части
- получил при проведении ошибку записи в регистр сведений "запись с такими ключевыми полями..." (ну вы в курсе, про неуникальность)

Так что условия, требуемые для того, чтобы СУБД вообще "не дергалась", несколько строже, чем простое совпадение набора с существующей записью.