ujunのブログ

Relational DBMS Internals - Ch.2

最近読んでいるので、2章のまとめ。

http://pages.di.unipi.it/ghelli/bd2/DBMS-Internals.pdf

  • Permanent Memory And Buffer Management
    • DBMSを実装する上で最初に解決するべきは、システムを構成する複数のコンポーネントに依存せずストレージを抽象的に扱うことのできるレイヤの提供である
      • Permanent Memory ManagerとBuffer Managerによって実現される
    • 記憶領域の種類
      • Main memory
      • Permanent memory with magnetic disks
      • Temporary memory with NAND flash memory
    • Permanent Memory Manager
      • diskを抽象化するレイヤを提供する
      • 各DBを物理ファイル(物理ページ)の集合で表現する
      • DBとは実データやインデックスの物理ページを含んだディレクトリである
      • 各レコードは実ファイル上に構成される論理ファイルとなる
    • Buffer Manager
      • Permanent Memory のページをMain memoryと対応される役割
      • トランザクションが必要としているページを取得するのに責任を持つ
      • クエリのパフォーマンスはTemporary memory に読み込むページの数に依存する
      • 以下BufferManagerの構成要素
        • The buffer pool
          • Permanen memory のコピーやその保持情報を格納するArray
          • 固定サイズなので、適切なアルゴリズムにしたがってfreeして空き容量を確保する必要がある
          • Arrayの各要素は以下の変数を持つ (最初はすべての要素のpin countは0, dirtyはfalse)
            • the pin count(その要素が含むページが現在参照されている数)
            • dirty(そのページが、buffer poolに読み込まれて以降に更新があったか)
        • A hash resident pages table
          • permanent memeory pageがbuffer poolにのっているかとその対応するArrayの要素を管理する
      • Buffer Managerは以下のようなインタフェースを提供する
        • getAndPinPage(P)
          • P(ページ)がArrayの要素になっていれば、そのpin countをインクリメントする
            • Pのidを返す
          • PがArrayの要素になっていなければ
            • freeなArrayの要素(pin countは0)をgetする(LRUなどアルゴリズムはいくつかある).
              • ただしgetした要素がdirtyであればflushする(例えば物理ページにwrite outするなどして).
              • Arrayに空きがなければexception
            • getした要素にページを読み込んでpin countをインクリメントする(つまり1). dirtyはfalseとする.
            • BufferManagerはその要素のpin countが0にならないかぎり他のページをその要素にロードすることはない
            • resident table の情報をupdateする
              • 古いページに関する情報をdelete
              • 新しいページに関する情報をinsert
        • setDirty(P)
          • requesterがPを更新するときこれを呼ぶ. BufferManagerにArrayの対応する要素のdirtyをTrueにするよう指示する
        • unpinPage(P)
          • requesterがもはやPを必要としない時これを呼ぶ. BufferManagerはこのArray要素のpin countをデクリメントする
        • flushPage(P)
          • requesterがPをpermanent memoryに書き出したいときにこれを呼ぶ.
          • PがdirtyであったらBufferManagerはPをpermanent memoryに書く.
      • unpinしたりflushしたりするのはrequesterではなくTransaction and Recovery Managerによって行われる.
        • requesterはリクエストを出すのみ.