Update
當必須更新行時,數據庫是否會進行刪除和插入?
所以今天一位教授告訴我們,當數據庫必須進行更新時,在內部(在低級別)它會先刪除,然後再插入更新的欄位。然後他說這是所有數據庫都做的事情,然後我開始討論說我認為這沒有意義,但我沒有足夠的資源來支持我的立場。他似乎知道很多,但我不明白為什麼 dbs 會那樣做。
我的意思是,我知道如果您更新一個欄位並且您需要更多空間來儲存該行,那麼它可能會物理刪除該行並將其放在新數據的末尾。但是,例如,如果您減少使用的空間,為什麼要刪除並在最後重新插入呢?
這是真的嗎?有什麼好處?
這是真的嗎?
不,這是一個實現細節。如果數據庫願意,它可以在適當的位置實施適當的更新。
有什麼好處?
將更新拆分為刪除然後插入通常會使實現更簡單。潛在的附帶好處包括能夠通過對拆分刪除/插入操作進行適當排序來避免唯一索引中的瞬時鍵違規。
與真正的就地更新相比,拆分更新可能會慢一些並生成更多日誌(無論如何這並不總是可能的)。
正如 Kin 在評論中指出的那樣,如果您需要一個範例(對於 SQL Server),請參閱:
- 是否所有更新都拆分為刪除插入?蓋爾·肖;和
- 對索引鍵的更改真的會進行就地更新嗎?保羅·蘭德爾
它也與實現 MVCC 有關。在關於MVCC的維基百科頁面中,提到了:
當 MVCC 數據庫需要更新一項數據時,它不會用新數據覆蓋舊數據,而是將舊數據標記為過時,並在其他地方添加新版本。因此儲存了多個版本,但只有一個是最新的。這允許讀者訪問他們開始閱讀時的數據,即使它被其他人修改或刪除。
另請參閱Bruce Momjian 的PostgreSQL Internals pdf第 60 頁(Postgres 使用 MVCC): “
UPDATE
實際上是 aDELETE
和 anINSERT
。”