gifts2017

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

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

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