繁体   English   中英

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

[英]SQL Server Log full due to active transaction

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

由于“ACTIVE_TRANSACTION”,数据库“STAGING”的事务日志已满。

我正在尝试运行以下语句:

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

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

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

我的数据库大小如下

在此处输入图像描述

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

在此处输入图像描述

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

如果我分批运行:

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 OR SQL Server 2016 SP1 或更高版本(任何版本),另一件可以显着提高性能的事情是为表及其索引打开data_compression = page

谢谢你的帮助米奇。 我实际上已经增加了事务日志大小并删除了所有索引作为其临时数据库。 它在24s内更新了1700万行:)

虽然我对解决方案不是很满意,但由于时间不够,我会更进一步。 我将不得不进一步研究效率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM