Действительно быстрая очистка всей регистрации изменений

25.01.16

База данных - HighLoad оптимизация

Если вы хоть раз сталкивались с проблемой накопленных изменений при обмене, то данная статья может оказаться полезной

Первый вопрос, который, наверное, возникает у того, перед кем подобная задача никогда не стояла, "зачем?".
Чем не нравится "ПланыОбмена.УдалитьРегистрациюИзменений(...)"?

Только вот, допустим, у вас обмен, который происходит раз в минуту, "встал". И так не обменивался дня так два.
При этом в базе работают более сотни пользователей, которые всё это время туда что-то вносили и продолжают вносить.
Шансов, что обмен данными будет успешным, в этом случае практически нет. Обычно создаётся новый узел обмена, делается резервная копия базы, потом "Планы обмена.УстановитьГлавныйУзел" и удалить существующий узел. 
Потому как он будет копить регистрацию изменений и замедлять запись даных в БД 

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

Что же делать? Конечно, обратиться к более быстрым методам - MS SQL.

Для начала следует создать в БД следующую хранимую процедуру:

USE [ИмяБД]
GO


CREATE PROCEDURE usp_GenerateSQL
    @Pattern AS varchar(255)
    ,@PrintQuery AS bit
    ,@ExecQuery AS bit
AS
BEGIN
    DECLARE @sql AS varchar(max)

    SELECT @sql = COALESCE(@sql, '') + 'truncate table [' + TABLE_NAME + ']' + CHAR(13) + CHAR(10)
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME LIKE @Pattern

    IF @PrintQuery = 1 PRINT @sql
    IF @ExecQuery = 1 EXEC (@sql)
END

GO

Что она делает? Перебирает все таблицы в БД по части их имени и выполняет для них инструкцию Truncate Table
А далеее всё просто:

exec usp_GenerateSQL @Pattern = '%Chng%', @PrintQuery = 0, @ExecQuery = 1

И за пару секунд все таблицы регистрации будут очищены. В чём прикол? В Truncate Table, конечно.
Эта инструкция очищает БД без записи в лог, без транзакции, т.е. очень очень быстро.

P.S. Всё выше описанное, конечно, приведено только в ознакомительных целях и никогда мной не делалось :)
P.P.S. Автор не несёт никакой ответственности за любой ущерб вашей БД, который могут повлечь за собой эти действия.
P.P.P.S. Если в финальной строчке заменить "Chng" на "Doc" или "Rg", можно соответственно удалить все документы или все регистры из БД... также за пару секунд.

Обмен Изменения Регистрация изменений Очистка регистрации

См. также

HighLoad оптимизация Программист Платформа 1С v8.3 1C:ERP Бесплатно (free)

Приведем примеры использования различных в динамических списках и посмотрим, почему это плохо.

18.02.2025    3268    ivanov660    35    

53

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    6519    ivanov660    12    

57

HighLoad оптимизация Программист Платформа 1С v8.3 Бесплатно (free)

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    11235    Evg-Lylyk    63    

45

HighLoad оптимизация Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    5876    spyke    28    

51

HighLoad оптимизация Программист Платформа 1С v8.3 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    8747    vasilev2015    20    

43

HighLoad оптимизация Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих запросов на sql, ожиданий, конвертация запроса в 1С и рекомендации, где может тормозить.

2 стартмани

15.02.2024    14315    283    ZAOSTG    87    

118
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Brawler 460 25.01.16 13:42 Сейчас в теме
2. DrAku1a 1754 28.01.16 02:27 Сейчас в теме
Вы открыли для себя TRUNCATE?
А вообще плюс - за универсальную процедуру.
3. comol 5123 28.01.16 18:13 Сейчас в теме
(2) DrAku1a, Нее... я открыл для себя процедуру поиска таблицы по части названия... :)
4. teller 29.01.16 07:47 Сейчас в теме
P.S. Всё выше описанное, конечно, приведено только в ознакомительных целях и никогда мной не делалось :)
P.P.S. Автор не несёт никакой ответственности за любой ущерб вашей БД, который могут повлечь за собой эти действия.

+100500
Antonov.AV; +1 Ответить
5. logarifm 1123 30.01.16 02:00 Сейчас в теме
Не забываем, что этим мы нарушаем лицензионное соглашение 1С.
6. sitec 1 20.02.16 09:21 Сейчас в теме
+1 За поиск таблиц по части имени
7. Makushimo 160 23.09.16 08:29 Сейчас в теме
Особенно понравилось, "сам так не делал, но вы будьте осторожны" ))))
Красавчег.
Дал ребенку заряженный пистолет и довольный ходит.
8. корум 288 23.09.16 09:55 Сейчас в теме
(7) Makushimo, табличка *сарказм* в руках автора обязательна, ага
9. user611061_igor_panshin 12.09.19 11:18 Сейчас в теме
Одна бравада. DECLARE @sql AS varchar(max) имеет ограничения по длине, поэтому "все таблицы регистрации будут очищены. " - это ошибка.
10. comol 5123 16.09.19 01:11 Сейчас в теме
(9)
Одна бравада
ну и зачем оскорбления?!
это ошибка.
и в чём нашли ошибку?! В типовой рознице varchar(max) вполне хватает для скрипта очистки всех таблиц и успешно использовалось на практике.

Код вполне себе открыт - если очищаете ERP разбейте на несколько кусочков. Зачем писать гневные коменты.... вот люди
11. user611061_igor_panshin 16.09.19 09:29 Сейчас в теме
declare @nm varchar(1000)
DECLARE cur CURSOR FOR
sel ect
distinct
name
fr om
sysobjects
wh ere xtype='U'
and name like '%Chng%'
order by
name

--Откроем курсор
OPEN cur

--Выборка данных первой строки
FETCH NEXT FROM cur INTO @nm

--Пока есть данные в курсоре - выборка циклом
WHILE @@FETCH_STATUS = 0
BEGIN
print 'truncate table ['+@nm+']' + CHAR(13) + CHAR(10)
--Выборка следующей строки
FETCH NEXT FR OM cur INTO @nm
END

--Закрываем курсор
CLOSE cur
--Уничтожаем курсор
DEALLOCATE cur
12. comol 5123 16.09.19 20:49 Сейчас в теме
(11) это что, вы открыли для себя курсоры? :)). Следующим этапом будут временные таблицы :). Ну если не хватает длинны строчки меняйте просто на выполнение запроса сразу. Truncate работает мгновенно, выполнением единым пакетом экономите секунд 5 :))).
Оставьте свое сообщение