[英]The transaction log for database 'tempdb' is full due to 'ACTIVE_TRANSACTION'
[英]MS SQL log size is not enough or "the transaction log for database is full due to 'active_transaction'."
我正在尝试使用 select 查询的结果更新表。 问题是查询花费的时间太长,并且我收到一个错误,即日志文件不够。 例如:
With cte as (
select t1.key, t1.col1, t2.col2, t3.col3
from t1
left join t2 on t1.key = t2.key
left join t3 on t1.ket = t3.key
)
UPDATE t4
SET t4.col1 = cte.col1
t4.col2 = cte.col2
t4.col3 = cte.col3
from cte
where
t4.key = cte.key
现在我正在按部分更新表格(只需将查询的结尾更改为
where
t4.key < 10000000
t4.key = cte.key
)。 有什么办法可以优化它并使查询更快?
有什么办法可以优化它并使查询更快?
你已经做了大部分。 在范围有限的批次中进行更新(在您的情况下, key < 10000000
)是对表进行这种大规模更新的方法。 每个块中更多的块和更少的行将执行得更好。 当我做这种事情时,我会使用很多批次,通常每个批次有 500 行。
您还可以做另一件事:不要更新已经具有正确值的行。 像这样:
...
UPDATE t4
SET t4.col1 = cte.col1
t4.col2 = cte.col2
t4.col3 = cte.col3
FROM cte
WHERE t4.key = cte.key
AND t4.col1 <> cte.col1
AND t4.col2 <> cte.col2
AND t4.col3 <> cte.col3
这里的重点是让每个 UPDATE 语句接触有限数量的行。 SQL 服务器通过将整个更新写入其事务日志来工作。 然后,当它知道整个事务将成功时,它会根据事务日志中的数据更改表。 所有这一切都是为了让其他查询能够看到表中的旧值,直到您的 UPDATE 语句完成并一次全部进入表中,而不是慢慢进入。这都是 SQL 的ACID的一部分——原子性、一致性、隔离性,耐用性——功能性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.