sql update会删除然后插入吗?

时间:2015-04-21 22:38:12

标签: sql-server database tsql

Sql server究竟是如何执行更新操作的?它是否进行了更新?或者它会删除然后插入每个相关的行?据我所知,更新操作类似于删除,然后插入旧值存储在已删除,新值存储到插入...

我被告知更新操作是通过删除然后插入来完成的,但我不确定为什么会这样实现。请赐教。

3 个答案:

答案 0 :(得分:2)

MSDN Update section

  

当UPDATE语句导致以下任一操作时,数据库引擎会将部分更新转换为完全更新:

     
      
  • 更改分区视图或表的键列。

  •   
  • 修改多行,并将非唯一聚簇索引的键更新为非常量值。

  •   

partial 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 如果您的更新更改了多行的聚簇索引,那么事情变得非常有趣。系统可以将更新分解为删除和插入,但是如果要插入的行之一将占据与正被删除的行之一相同的位置,那么这些操作可能会重新组合到更新中,即使在逻辑级别它们也是如此最初是处理不同的行。