SQL 由于活动事务,服务器日志已满

SQL Server Log full due to active transaction

我一直在尝试更新 table 中的列,但出现以下错误:

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())

我的 table 有大约 1800 万行。上面的更新将修改所有行。 table 大小为 2.5 GB。数据库也处于简单恢复模式

这是我将在不同 table 上经常做的事情。我该如何管理?

我的数据库大小如下

以下是数据库属性!!!我试过将日志大小更改为无限制,但它又恢复为默认值。

谁能告诉我处理这种情况的有效方法?

如果我运行分批:

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

您在单个事务中执行更新,这导致事务日志变得非常大。

相反,分批执行更新,比如一次 50K - 100K。

您是否有关于 END_EFFECTIVE_DT_TM 的索引,其中包括 ACTIVE_INDvalid_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 SP1 或更高版本(任何版本),另一件可以显着提高性能的事情是为 [= 打开 data_compression = page 24=] 和它的索引。