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の要素を管理する
- The buffer pool
- 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
- freeなArrayの要素(pin countは0)をgetする(LRUなどアルゴリズムはいくつかある).
- P(ページ)がArrayの要素になっていれば、そのpin countをインクリメントする
- 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に書く.
- getAndPinPage(P)
- unpinしたりflushしたりするのはrequesterではなくTransaction and Recovery Managerによって行われる.
- requesterはリクエストを出すのみ.
- DBMSを実装する上で最初に解決するべきは、システムを構成する複数のコンポーネントに依存せずストレージを抽象的に扱うことのできるレイヤの提供である