gpt4 book ai didi

sql-server - 由于事件事务,SQL Server 日志已满

转载 作者:行者123 更新时间:2023-12-04 02:55:47 27 4
gpt4 key购买 nike

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

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

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

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

我的数据库大小如下

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

最佳答案

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

相反,请分批执行更新,例如一次 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);

如果您运行的是企业版或 SQL Server 2016 SP1 或更高版本(任何版本),另一件可以显着提高性能的事情是打开 data_compression = page对于表及其索引。

关于sql-server - 由于事件事务,SQL Server 日志已满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53148184/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com