【发布时间】:2019-04-08 10:42:26
【问题描述】:
我一直在尝试更新表中的列,但出现以下错误:
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。数据库也处于简单恢复模式
这是我会在不同的桌子上经常做的事情。我该如何管理?
我的数据库大小如下
以下是数据库属性!!!我已尝试将日志大小更改为无限制,但它会恢复为默认值。
谁能告诉我处理这种情况的有效方法?
如果我分批运行:
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
【问题讨论】:
-
谢谢米奇!!您能否建议任何内存更改以及我可以做的让它处理更多更新/插入
-
不,END_EFFECTIVE_DT_TM 上没有索引。我会尝试分批运行它。实际上,我一直在同一张表上进行批量截断,并且它们在相同的行数上运行得很好。但不知何故更新失败!我在另一个具有相同配置的数据库上进行了相同的更新,并且成功了。
标签: sql-server tsql transaction-log