2013-09-23 118 views
0

我聽說過一些傳言,當主鍵列的值發生變化時,應該刪除行,然後插入新值,而不是剛剛更新的列。主鍵更新與主鍵刪除+插入

當主鍵更新並且未被刪除/插入時,是否會有任何性能影響?

+0

我找到了一個很好的鏈接[鏈接](http://stackoverflow.com/questions/3838414/can-we-update-primary-key-values-of-a-table),閱讀Vincent Malgrat給出的答案 –

回答

5

當您更新主鍵:

  • 支持索引更新。
  • 如果是外鍵,則會檢查兒童的 。

但是,如果你做一個刪除和一個插入,刪除這兩個點都被執行,並且插入索引被更新。所以沒有增益做刪除和插入。或者我沒有意識到。

不久之後,做兩次操作而不是一次操作更糟。不包括那個刪除是最難的操作。

1

最大的表現和併發的影響是當你沒有索引子表FKs。在這種情況下,Oracle沒有其他選擇,然後鎖定整個子表進行掃描以驗證參照完整性。

也許這不知何故混淆UPDATE與DELETE/INSERT的主鍵。也許是因爲Oracle支持CASCADE ON DELETE,但不支持UPDATE

當你需要更新時,不要使用delete + insert。

3

雖然我堅信你應該設計你的物理模型,以便外鍵是as stable as possible,但有時你真的需要更新一組鍵,例如由於重組。

我們來比較簡單更新和刪除+插入主鍵之間的數據邊。我們將假設不存在外鍵,也沒有表上的其它索引你的表是作爲一個堆(默認)和現在:

  1. 簡單的更新

    • 數據修改後的:表格的行數據將直接在塊中修改。主鍵列通常很小,所以行不太可能被遷移。主鍵索引作爲一個普通索引:一個更新鍵會使項指向舊密鑰被刪除,而新的條目指向新的值將被插入。
    • 重做條目:重做用於更新將包含在數據操作的物理變化:單個列更新(小重做)和索引刪除+插入件。
    • 撤消條目:撤消將包含舊列值(小撤消)和反向插入+索引的刪除。

  2. 刪除+插入改性

    • 數據(重做):甲骨文將必須物理地刪除該行並插入另一行。從直接數據的角度來看,刪除行是一個簡單的操作:包含該行的塊位於該行,並且該行被標記爲已刪除。如果該塊仍包含足夠數量的數據(其他未刪除的行),則它將保持原樣。如果不是(低於段的PCTUSED值),它將被添加到符合插入條件的塊列表中。由於需要記錄所有列的值,插入會導致更多的重做。當然,刪除舊行並插入新行將導致刪除舊索引條目並創建新索引條目(與上面相同)。
    • 撤消條目:刪除操作需要記錄舊行的所有列的值。另一方面,插入作爲簡單刪除被撤消保護。

如果表中還有其他的指標,它會更糟,因爲每個索引將需要維持一個刪除+插入(而它們保持不變通過主鍵更新,除非列重疊) 。

如果有引用此表的鍵,那麼在兩種情況下都會遇到引用問題。如果表引用了其他表,那麼再次使用delete + insert時會有更多工作(除非引用基於主鍵列,在這種情況下它或多或少會相同)。

結論:由於插入+刪除影響了基表中的所有列,就會造成比簡單的更新更多的工作:更撤消,所有指標更重做和兩個操作(而不是主關鍵指標)。

如果您的表是按索引組織的,則工作量或多或少會相同,因爲該行將在物理上移動,但我確信單個更新仍然會比兩個單一操作更高效(因爲每個操作都涉及開銷)。