CMU 15-445 Multi-Version Concurrency Control

  • MVCC は複数バージョンを持つことで、writer は reader をブロックせず、reader は writer をブロックしない

    • writer がロックを取っていても reader は前のバージョンを読めば良いのでブロックされない
    • 逆に read していても writer は新しいバージョンを作れば良いのでブロックされない
    • W-W は 2PL なり OCC なりで調停しないといけない
    • (疑問)MVCC と S2PL を組み合わせると read only じゃない限り、ロック取っちゃうから嬉しくない?
  • version storage

    • append only
      • バージョン番号をつけた新しい行を追加する
      • 簡単だけど copy が必要
    • time travel storage
      • time travel table に古い行を突っ込んで、メインテーブルには新しい行を入れる
      • gc が楽
    • delta storage
      • 変更したカラムのデータだけ入れる
      • 差分が少ない
  • garbage collection

    • tuple level
      • background vacuuming
        • シーケンシャルスキャンして不要なデータを消す
        • シーケンシャルスキャンでバッファプールが死ぬ
        • dirty page bitmap を持てば回避できる
      • cooperative cleaning
        • 各スレッドがバージョンチェインを舐めるときに不要なデータを消す
    • trx level (advanced)
  • index management

    • バージョンを扱うと更新ごとに index の更新が必要になる
    • secondary index が参照する先を pk にすると、更新が減る
    • あるいは間接層をはさんで index の参照先と物理IDのマッピングを作る。