【问题标题】:SQL Server Used Transaction Log Space Not Decreasing After Long UPDATE FinishesSQL Server 使用的事务日志空间在长时间 UPDATE 完成后没有减少
【发布时间】:2017-03-07 11:11:33
【问题描述】:

在 SQL Server 中,我有一个包含 1200 万行和 5.6 GB 存储空间的表 (dbo.MYTABLE)。

我需要为每条记录更新一个 varchar(150) 字段。

我在 WHILE 循环中执行 UPDATE 操作,每次迭代更新 50K 行。

事务日志似乎在每次迭代后不会释放,并且会不断增长。 甚至,在所有 UPDATE 过程完成后,也不会返回 Transaction Log 空间。

我的问题是,为什么即使更新完成,使用的事务日志空间也不会减少。代码如下:

DECLARE @MAX_COUNT INT;
DECLARE @COUNT INT;
DECLARE @INC INT;

SET @COUNT = 0;
SET @INC = 50000;

SELECT @MAX_COUNT=MAX(ID) FROM  dbo.MYTABLE(NOLOCK)
WHILE @COUNT <= @MAX_COUNT
BEGIN

    UPDATE dbo.MYTABLE
    SET NEW_NAME = REPLACE(NAME,' X','Y'))
    WHERE ID > @COUNT AND ID<=( @COUNT + @INC)

    SET @COUNT = (@COUNT + @INC)
END

【问题讨论】:

  • 您的数据库是处于简单恢复模式还是完全恢复模式?
  • 没有 Begin Transaction... Commit 包裹着这个,所以这仍然被认为是一个大事务并且会被记录。
  • @G.Davison,数据库处于完全恢复模式。
  • 在完全恢复模式下,日志不会被截断,直到您执行事务日志备份并截断日志以释放空间。

标签: sql-server transactions database-administration transaction-log


【解决方案1】:

如果你不做事务日志备份,切换到简单:

USE [master]
GO
ALTER DATABASE [YOUR_DB] SET RECOVERY SIMPLE WITH NO_WAIT
GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多