2014-07-10 102 views
2

如果我知道錯誤,請糾正我。當我們命令更新一行時,數據庫會執行刪除和刪除操作。誰能告訴我爲什麼或建議我閱讀一篇文章?爲什麼數據庫在刪除和插入時更新行?

+0

你介意解釋一下好嗎?用一些例子。 –

+0

也許你指的是如何更新B-Tree索引? DBMS不能只是改變鍵值,而不能將它移動到索引結構中的不同位置。 –

回答

2

一些數據庫將使用刪除和插入來實現更新,並且將有一個日誌結構的文件系統,因此對行的更新會將舊的刪除行留在其原始位置,並在某處寫入該行的新副本其他。

查看http://blog.notdot.net/2009/12/Damn-Cool-Algorithms-Log-structured-storage討論日誌結構文件系統的一般用途和數據庫。

在什麼系統使用這個條款,上述參考文獻提及:

跟我唱它的讚美詩那麼大聲,你可能想知道什麼 系統已經使用這種算法。有令人驚訝的少數 我所知道的,但這裏有一些顯着的:

  1. 儘管最初的Berkeley DB的使用相當標準的架構,Java移植,BDB-JE使用所有的組件,我們剛剛描述。

  2. CouchDB使用剛纔描述的系統,除了不是將日誌分成段和垃圾收集它們,而是在有足夠陳舊的數據積累時重寫它的整個數據庫。

  3. PostgreSQL使用MVCC,它的writeahead日誌結構化,以允許我們描述的增量備份方法。

  4. App Engine數據存儲基於Bigtable,它採用不同的磁盤存儲方法,但事務層 使用樂觀併發。有關使用日誌結構附加,而不是替代更新的優點

http://blogs.justonedatabase.com/tag/update-in-place/也舉行了會談。它提到:

當我們追加更新,而不是覆蓋數據,我們能夠保持 舊的和一致的版本的數據,而更新是在 進步,這提供了一個強大的恢復機制應該 更新失敗。我們可以輕鬆地爲更新添加水印,只有當我們知道更新已完成併成功保存在存儲中時,我們纔可以選擇僅移動該水印。鑑於 更新原地語義,我們必須在更新發生之前將舊版本 寫入並保留在單獨的日誌中,以便能夠保證從失敗的更新中恢復(假設從數據庫完全恢復 備份副本對於大多數 人來說有點過於簡單)。

2

大多數DBMS將嘗試在沒有刪除/插入的情況下進行更新。

但是由於物理存儲的原因,可能會有一些情況需要這種情況。您更新聚簇索引執行全表掃描,更新將更改表中該記錄的位置,例如,

update table set clusterindexcol = clusterindexcol + 10 

當記錄移動到物理表內的不同位置時,它可能會第二次更新。

或者您正在更新多個行的主鍵列,檢查重複項的最簡單實現是delete/insert。

相關問題