情况如下:
一个大型生产客户端/服务器系统,其中一个中央数据库表具有某个列,该列具有NULL作为默认值但现在具有0作为默认值。但是,在更改之前创建的所有行仍然具有null值,并且在此系统中会生成大量不必要的错误消息。
解决方案当然很简单:
update theTable set theColumn = 0 where theColumn is null
但我想这需要花很多时间来完成这笔交易?除此之外,在我这样做之前还有其他问题需要考虑吗?这个大事务会在整个更新过程中阻塞整个数据库还是特定的表?
这个特殊的表有大约550k行,其中500k具有空值,并且会受到上述sql语句的影响。
答案 0 :(得分:2)
对其他连接客户端性能的影响取决于:
db引擎将获取写锁定,因此当您的客户端只需要对表的读访问权时,它应该不是一个大问题。
500.000记录对我来说听起来不是太多,但正如我所说,更新所需的时间和资源取决于很多因素。
您是否有类似的测试系统,您可以在哪里试用更新?
另一种解决方案是将一个大的更新拆分为许多小更新并将它们循环调用。
当客户经常写入该表时,您的更新语句可能会“永久”被阻止。我见过数据库,逐行执行更新是获得更新的唯一方法。但这是一张包含约200,000,000条记录和约500个非常活跃客户的表格。
答案 1 :(得分:1)
这将花费大量时间来完成此交易
没有明确的方式来说这个。取决于硬件,并发会话数,表是否有锁,相互依赖的触发器的数量等等。
此大事务是否会在整个更新过程中阻止整个数据库或特定表
如果“整个数据库”依赖于此表,则可能。
在我这样做之前,我还应该考虑其他任何问题
如果表已被其他事务锁定 - 您可能会遇到行锁定情况。在极少数情况下,也许是死锁情况。最好的办法是确保没有人使用该表,检查任何预先存在的锁,然后运行该声明。
答案 2 :(得分:0)
锁定问题是特定于供应商的。
假设桌面上没有触发器,即使桌面上有很多索引,也有50万行对于专用数据库服务器来说并不多。