Sql server究竟是如何执行更新操作的?它是否进行了更新?或者它会删除然后插入每个相关的行?据我所知,更新操作类似于删除,然后插入旧值存储在已删除,新值存储到插入...
我被告知更新操作是通过删除然后插入来完成的,但我不确定为什么会这样实现。请赐教。
答案 0 :(得分:2)
当UPDATE语句导致以下任一操作时,数据库引擎会将部分更新转换为完全更新:
更改分区视图或表的键列。
修改多行,并将非唯一聚簇索引的键更新为非常量值。
部分更新事务直接将字符串写入表列的用户定义位置,而不发出删除和替换命令,就像在完整更新中一样。
部分更新不支持多字节字符集转换。部分更新支持仅限于Microsoft SQL Server。
我做了一些搜索,看起来你的问题的答案取决于你正在更新的内容。
希望这有帮助。
答案 1 :(得分:1)
取决于你的意思。如果您要求删除和插入是否与性能更新相似,则答案是否定的。人们已经问过这个问题。他们说更新更快,因为它必须只记录一次,他们可能列出了其他原因,但我没有读过。 In SQL, is UPDATE always faster than DELETE+INSERT?
对于在更新语句后触发的触发器,您可以访问"已删除的"和"插入"表格将分别包含旧行和新行。所以它似乎删除然后更新。
对我而言,我并不关心后台发生的事情。我最好的猜测是SQL Server只是将旧值更改为新值,因为它可能是最有效的。但无论哪种方式,只要选择最佳表现。
答案 2 :(得分:1)
这取决于。如果您正在更新属于聚簇索引的列,那么是的,SQL Server可以在内部将操作更改为更像旧行的删除和新行的插入(S) 1
如果您没有更改聚簇索引,那么SQL Server通常会执行更有效的更新。
但最终,这并不重要,因为实际发生的物理操作不会对你造成任何明显的影响。
1 如果您的更新更改了多行的聚簇索引,那么事情变得非常有趣。系统可以将更新分解为删除和插入,但是如果要插入的行之一将占据与正被删除的行之一相同的位置,那么这些操作可能会重新组合到更新中,即使在逻辑级别它们也是如此最初是处理不同的行。