我听说过一些传言,当主键列中的值发生变化时,应删除行,然后插入新值而不是更新列。
主键更新但未删除/插入时是否会影响性能?
答案 0 :(得分:5)
更新主键时:
但是如果你执行删除和插入操作,则执行删除操作和插入时,将更新索引。所以删除和插入没有任何好处。或者我都不知道。
很快,做两次操作而不是一次操作会更糟。不计算删除是最难的操作。
答案 1 :(得分:3)
虽然我坚信您应该设计物理模型以使外键为as stable as possible,但有时您确实需要更新一组键,例如由于重组。
让我们比较简单更新和主键的删除+插入之间数据面发生了什么。我们假设您的表被组织为一个堆(默认),并且现在表中没有外键或其他索引:
简单更新
删除+插入强>
PCTUSED
值),它将被添加到符合插入条件的块列表中。由于需要记录所有列的值,因此插入会导致更多重做。当然,删除旧行并插入新行将导致删除旧索引条目和创建新索引条目(与上面相同)。如果表中有其他索引,那就更糟了,因为需要为delete + insert维护每个索引(除非列重叠,否则它们不受主键更新的影响)。
如果有引用此表的键,则在这两种情况下都会遇到引用问题。如果表引用了其他表,那么你将在delete + insert中有更多的工作(除非引用再次基于主键列,在这种情况下它将或多或少相同)。
结论:由于insert + delete会影响基表的所有列,因此它会比简单更新产生更多的工作:更多撤消,更多重做以及对所有索引的两个操作(而不是主键索引。)
如果你的表是索引组织的,那么工作量或多或少会相同,因为行将在物理上移动,但我很确定单个更新仍然比两个单独的操作更有效(因为每个操作都涉及开销)。
答案 2 :(得分:1)
最大的性能和并发影响是当您没有子表FK的索引时。在这种情况下,Oracle没有其他选择,然后锁定整个子表,扫描它以验证参照完整性。
也许这与主键上的UPDATE vs. DELETE / INSERT混淆了。也许是因为Oracle支持CASCADE ON DELETE
但不支持UPDATE
。
当您需要更新时,只需不要使用delete + insert。