繁体   English   中英

MS SQL 日志大小不够或“由于 '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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM