Oracle 主键更新与主键删除+;插入
我听过一些传言,当主键列中的值发生变化时,应该删除行,然后插入新值,而不是只更新列Oracle 主键更新与主键删除+;插入,oracle,oracle11g,Oracle,Oracle11g,我听过一些传言,当主键列中的值发生变化时,应该删除行,然后插入新值,而不是只更新列 更新主键而不是删除/插入主键时是否有任何性能影响?更新主键时: 支持索引已更新 如果是外键,则将检查外键 给孩子们 但是,如果执行删除和插入,则对于删除,将执行两个点,对于插入,将更新索引。因此,执行删除和插入操作没有任何好处。或者我不知道 很快,两次操作比一次更糟糕。不计算删除是最难的操作。最大的性能和并发影响是在子表FKs上没有索引时。在这种情况下,Oracle没有其他选项来锁定整个子表并扫描它以验证引用
更新主键而不是删除/插入主键时是否有任何性能影响?更新主键时:
- 支持索引已更新李>
- 如果是外键,则将检查外键 给孩子们
很快,两次操作比一次更糟糕。不计算删除是最难的操作。最大的性能和并发影响是在子表FKs上没有索引时。在这种情况下,Oracle没有其他选项来锁定整个子表并扫描它以验证引用完整性 也许这与主键上的更新与删除/插入混淆了。可能是因为Oracle在删除时支持级联,但在更新时不支持级联
当您确实需要更新时,不要使用delete+insert。虽然我坚信您应该设计物理模型,以使外键可用,但有时确实需要更新一组键,例如由于重组 让我们比较一下简单更新和删除+插入主键在数据端发生的情况。我们假设您的表被组织为一个堆(默认),目前表上没有外键或其他索引:
- 修改数据:直接在块中修改表的行数据。主键列通常很小,因此不太可能迁移行。主键索引充当常规索引:对键的更新将导致删除指向旧键的条目,同时插入指向新值的新条目
- 重做条目:更新的重做将包含对数据进行的物理更改:单列更新(小重做)和索引删除+插入
- 撤消条目:撤消将包含旧列值(小撤消)和索引的反向插入+删除。
- 数据修改(重做):Oracle必须物理删除该行并插入另一行。从直接数据的角度来看,删除一行是一个简单的操作:包含该行的块被定位,并且该行被标记为已删除。如果该块仍然包含足够的数据量(其他未删除的行),它将保持原样。如果没有(在段的
值下方),它将被添加到符合插入条件的块列表中。由于需要记录所有列的值,因此插入会导致更多的重做。当然,删除旧行并插入新行将导致删除旧索引项并创建新索引项(同上)PCTUSED
- 撤消条目:删除操作需要记录旧行所有列的值。另一方面,insert在undo中作为简单的删除受到保护