論文:Fast Serializable Multi-Version Concurrency Control for Main-Memory Database Systems

この記事は、Fast Serializable Multi-Version Concurrency Control for Main-Memory Database Systemsという論文からのメモです。この論文は、2015年に発表されました。

シリーズ:DuckDBが採択した論文

このシリーズは、DuckDBが採用した論文を読んだ際のメモをまとめたものです。

主な内容

この論文は、データベースの並行処理制御についてのもので、主なMVCCがスナップショット分離レベル(SI)を提供する中、シリアライザビリティを提供しつつ、オーバーヘッドとロックが少ないマルチバージョン並行性制御(MVCC)の実装を提案しています。

アプローチとしては、トランザクションがデータを読み取る際にはスナップショットを使用するが、コミット時間軸で競合をチェックすることでシリアライザブルな分離レベルを提供するというものです。

DB分離レベル: スナップショット vs シリアライザブル

スナップショット分離レベルとシリアライザブル分離レベルを比較した記事はこちら

あとDuckDBはこの論文のコンセプトをもとにMVCCを実装しているのは見られるのですが、シリアライザブルな分離レベルのコントロールは実装されてない気がします。確証を取るには至っていないのですが現時点のコードとGitHubのイシューで見る限りスナップショット分離レベルを提供してるっぽいです。まあOLAPなのでそれで十分なんだろうと思います。

バージョンのストレージと位置

直接言及があるわけではないが、この「あちこちに存在するバージョン」というのはPostgreSQLがいい例な気がします。

PostgreSQLは簡潔さや確実なデータ保存を優先するため、永続するデータのストレージに多数のバージョンを保存する設計がされています。この設計判断によってVACUUMが必要になったり、ある程度サイズの大きいテーブルからレコードの正確な数を数えるのが物凄くコストの高いオペレーションになってしまいます。なのでトランザクションのバージョンをデータのストレージではない所に保存するのはそういった副作用がないので理にかなっている気はします。

ロックの削減

よりセレクティブなチェック

効率的な検証と競合解決

ベンチマーク