【发布时间】: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