Журнал SQL Server заполнен из-за активной транзакции - PullRequest
0 голосов
/ 05 ноября 2018

Я пытался обновить столбец в таблице, и я получаю сообщение об ошибке ниже:

 The transaction log for database 'STAGING' is full due to 'ACTIVE_TRANSACTION'.

Я пытаюсь выполнить следующее утверждение:

UPDATE [STAGING].[dbo].[Stg_Encounter_Alias]
    SET
        [valid_flag]            = 1

    FROM  [Stg_Encounter_Alias] Stg_ea
    where [ACTIVE_IND] = 1
        and [END_EFFECTIVE_DT_TM] > convert(date,GETDATE())

В моей таблице около 18 миллионов строк. И вышеприведенное обновление изменит все строки. Размер таблицы составляет 2,5 ГБ. Также БД находится в простом режиме восстановления

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

Размер моей базы данных указан ниже

enter image description here

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

enter image description here

Может кто-нибудь сказать мне эффективный способ справиться с этим сценарием?

Если я запускаю партиями:

begin
DECLARE @COUNT INT
SET @COUNT = 0

SET NOCOUNT ON;      
DECLARE @Rows INT,
    @BatchSize INT; -- keep below 5000 to be safe

SET @BatchSize = 2000;

SET @Rows = @BatchSize; -- initialize just to enter the loop


WHILE (@Rows = @BatchSize)
BEGIN
  UPDATE TOP (@BatchSize) [STAGING].[dbo].[Stg_Encounter_Alias]
    SET
        [valid_flag]            = 1

    FROM  [Stg_Encounter_Alias] Stg_ea
    where [ACTIVE_IND] = 1
        and [END_EFFECTIVE_DT_TM] > convert(date,GETDATE())
  SET @Rows = @@ROWCOUNT;
END;
end

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Спасибо за помощь, Митч. Я на самом деле увеличил размер журнала транзакций и удалил все индексы в качестве промежуточной БД. И его обновление 17 миллионов строк за 24 секунды

Хотя я не очень доволен решением, но из-за нехватки времени я иду с этим дальше. Я буду работать дальше над эффективностью.

0 голосов
/ 05 ноября 2018

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

Вместо этого выполняйте обновления в пакетном режиме, скажем, 50–100 тыс. За раз.

Есть ли у вас индекс END_EFFECTIVE_DT_TM, который включает ACTIVE_IND и valid_flag? Это поможет производительности.

CREATE INDEX NC_Stg_Encounter_Alias_END_EFFECTIVE_DT_TM_I_ 
ON [dbo].[Stg_Encounter_Alias](END_EFFECTIVE_DT_TM) 
INCLUDE (valid_flag) 
WHERE ([ACTIVE_IND] = 1);

Еще одна вещь, которая может существенно повысить производительность, если вы используете Enterprise Edition или SQL Server 2016 с пакетом обновления 1 (SP1) или более поздней версии (любая версия), - это включение data_compression = page для таблицы и ее индексов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...