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

Опубликовал Олег Филиппов (comol) в раздел Администрирование - Оптимизация БД (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", можно соответственно удалить все документы или все регистры из БД... также за пару секунд.

См. также

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

+100500
5. Александр Хомяк (logarifm) 967 30.01.16 02:00 Сейчас в теме
Не забываем, что этим мы нарушаем лицензионное соглашение 1С.
6. Компания Ситек (sitec) 20.02.16 09:21 Сейчас в теме
+1 За поиск таблиц по части имени
7. Максим Кузнецов (Makushimo) 149 23.09.16 08:29 Сейчас в теме
Особенно понравилось, "сам так не делал, но вы будьте осторожны" ))))
Красавчег.
Дал ребенку заряженный пистолет и довольный ходит.
8. rjhev korum (корум) 303 23.09.16 09:55 Сейчас в теме
(7) Makushimo, табличка *сарказм* в руках автора обязательна, ага
Оставьте свое сообщение