Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 主键更新与主键删除+;插入_Oracle_Oracle11g - Fatal编程技术网

Oracle 主键更新与主键删除+;插入

Oracle 主键更新与主键删除+;插入,oracle,oracle11g,Oracle,Oracle11g,我听过一些传言,当主键列中的值发生变化时,应该删除行,然后插入新值,而不是只更新列 更新主键而不是删除/插入主键时是否有任何性能影响?更新主键时: 支持索引已更新 如果是外键,则将检查外键 给孩子们 但是,如果执行删除和插入,则对于删除,将执行两个点,对于插入,将更新索引。因此,执行删除和插入操作没有任何好处。或者我不知道 很快,两次操作比一次更糟糕。不计算删除是最难的操作。最大的性能和并发影响是在子表FKs上没有索引时。在这种情况下,Oracle没有其他选项来锁定整个子表并扫描它以验证引用

我听过一些传言,当主键列中的值发生变化时,应该删除行,然后插入新值,而不是只更新列


更新主键而不是删除/插入主键时是否有任何性能影响?

更新主键时:

  • 支持索引已更新
  • 如果是外键,则将检查外键 给孩子们
但是,如果执行删除和插入,则对于删除,将执行两个点,对于插入,将更新索引。因此,执行删除和插入操作没有任何好处。或者我不知道


很快,两次操作比一次更糟糕。不计算删除是最难的操作。

最大的性能和并发影响是在子表FKs上没有索引时。在这种情况下,Oracle没有其他选项来锁定整个子表并扫描它以验证引用完整性

也许这与主键上的更新与删除/插入混淆了。可能是因为Oracle在删除时支持级联,但在更新时不支持级联


当您确实需要更新时,不要使用delete+insert。

虽然我坚信您应该设计物理模型,以使外键可用,但有时确实需要更新一组键,例如由于重组

让我们比较一下简单更新和删除+插入主键在数据端发生的情况。我们假设您的表被组织为一个堆(默认),目前表上没有外键或其他索引:

  • 简单更新

    • 修改数据:直接在块中修改表的行数据。主键列通常很小,因此不太可能迁移行。主键索引充当常规索引:对键的更新将导致删除指向旧键的条目,同时插入指向新值的新条目
    • 重做条目:更新的重做将包含对数据进行的物理更改:单列更新(小重做)和索引删除+插入
    • 撤消条目:撤消将包含旧列值(小撤消)和索引的反向插入+删除。

  • 删除+插入

    • 数据修改(重做):Oracle必须物理删除该行并插入另一行。从直接数据的角度来看,删除一行是一个简单的操作:包含该行的块被定位,并且该行被标记为已删除。如果该块仍然包含足够的数据量(其他未删除的行),它将保持原样。如果没有(在段的
      PCTUSED
      值下方),它将被添加到符合插入条件的块列表中。由于需要记录所有列的值,因此插入会导致更多的重做。当然,删除旧行并插入新行将导致删除旧索引项并创建新索引项(同上)
    • 撤消条目:删除操作需要记录旧行所有列的值。另一方面,insert在undo中作为简单的删除受到保护
  • 如果该表有其他索引,则情况会更糟,因为每个索引都需要为delete+insert维护(而主键更新不会影响它们,除非列重叠)

    如果有键引用此表,则在这两种情况下都会遇到引用问题。如果该表引用了其他表,那么在delete+insert中同样会有更多的工作(除非该引用再次基于主键列,在这种情况下,它或多或少是相同的)

    结论:由于insert+delete会影响基表的所有列,因此它将比简单的更新带来更多的工作:更多的撤消、更多的重做以及对所有索引(而不是仅对主键索引)的两个操作

    如果您的表是索引组织的,那么工作量将大致相同,因为行将被物理移动,但我非常确定一次更新仍然比两次操作更有效(因为每个操作都涉及开销)。

    我找到了一个很好的链接,请阅读Vincent Malgrat给出的答案