行を更新する必要がある場合、データベースは削除と挿入を行いますか?


13

そこで、今日、教授は、データベースが更新を行う必要がある場合、内部で(低レベルで)削除し、更新されたフィールドで挿入することを教えてくれました。それから彼は、これはすべてのデータベースで行われたものであると言い、それから私はそれが意味がないと思ったが、自分の立場をサポートするのに十分なリソースがなかったと話し始めました。彼は多くのことを知っているようですが、なぜdbsがそうするのか理解できません。

つまり、フィールドを更新し、その行にさらにスペースが必要な場合は、物理的に行を削除し、新しいデータで最後に配置することを知っています。しかし、たとえば使用するスペースを減らした場合、なぜ削除して最後に再挿入するのでしょうか?

これは本当ですか?利点は何ですか?


1
彼は特定の種類のデータベースについて話していましたか?
トムV-topanswers.xyzを試す16年

1
@TomV彼は、SQL Serverのについて話しましたが、彼は、それが...すべてのdbsに、このように行われていたことを言った
パブロ・マティアス・ゴメス

回答:


16

これは本当ですか?

いいえ、実装の詳細です。データベースは、必要に応じて適切な更新実装できます。

利点は何ですか?

更新を削除とそれに続く挿入に分割すると、一般的に実装が簡単になります。潜在的な副次的な利点には、分割削除/挿入操作を適切にソートすることにより、一意のインデックスで一時的なキー違反回避する機能が含まれます。

分割更新、実際のインプレース更新(常に可能とは限りません)よりも少し遅くなり、より多くのログを生成します。

Kinがコメントで述べたように、例(SQL Serverの場合)が必要な場合は、以下を参照してください。

MVCCの実装にも関連しています。MVCCに関するWikipediaページには、次のように記載されています。

MVCCデータベースがデータ項目を更新する必要がある場合、古いデータを新しいデータ上書きするのではなく、古いデータを古いものとしてマークし、新しいバージョンを別の場所に追加します。したがって、複数のバージョンが保存されますが、最新バージョンは1つだけです。これにより、他の人によって途中で変更または削除された場合でも、読者は読み始めたときにそこにあったデータにアクセスできます。

Bruce MomjianによるPostgreSQL Internals pdfの 60ページも参照してください(PostgresはMVCCを使用しています): " UPDATEis a DELETEand an INSERT。"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.