Neunomizuの日記

俺だけが俺だけじゃない

# CMU DB 5. Buffer Pools

tags: CMU DB

授業

復習としてOLTPとOLAPの話

ETL(extract transform load)

今回はDBMSがメモリをどう扱い,ディスクからデータを行き来するように動かすかという問題について扱う

  • 空間制御
    • 一緒に使われるページをディスク上で出来るだけ物理的に近づけることが目的
  • 時間制御
    • ディスクからデータを読み込む必要から発生するストールの数を最小化することが目的

Buffer Pool Manager

固定長のページの配列として管理されているメモリ領域を"buffer pool"と呼び,そのような要素の1つを"frame"と呼ぶ.

DBMSはディスクからframeに全く同じコピーを要求する.

ページテーブルは現在メモリ上にあるページを追いかける.また,ページごとの追加のメタデータを補完する.それを"dirty flag"や"pin/reference counter"と呼ぶ.前者は書き込み,後者は現在いくつのスレッドがそのページを読み書きしているかを管理し,使われている場合はメモリから追い出せないようにする.

  • Locks
  • Latches

    • Mutex(mutual exclusion)的なもの
    • 他のスレッドから守る
    • ロールバックが出来る必要はない
  • page table

    • データベースファイルにあるページIDのページの場所への写像
  • page directory
    • buffer pool frameにあるページIDのページのコピーへの写像

buffer poolは複数持っている.latchの競争を助け,局所性を改善する.

アプローチとしてはobject idとhashingがある

事前に読み込むことでI/Oを減らすことも可能

scan sharingでクエリにデータの再利用が出来る.

buffer pool bypassはオーバーヘッドを避けるためにbuffer poolに取ってきたページを納めない.

大半のディスク操作はOS APIを経験し,OSがファイルシステムのキャッシュを管理してしまう.大半のDBMSは使わないためには直接I/Oを使っている.

Replacement Policies

DBMSがframeを解放して新しいページのための空間を作るときの方針

LRU(least recently used)というアルゴリズムを使う.DBMSは最も古いタイムスタンプのページを選んで追い出す.

CLOCKはALUの近似.ページごとにタイムスタンプを必要としない.参照bitを各ページが持ち,ページがアクセスされるとそのbitが1となる.時計回りに一掃し,それが1なら0にして,0ならそれを追い出す.

LRUとCLOCKはsequential floodingという問題がある.全てのページを連続で読み込むクエリではbuffer poolが一度しか読まれず,二度と読まれない.

最近使われたページは実は最も必要のないページ

LRU-Kは最新のK個の参照のタイムスタンプを追い,連続アクセスの間隔を計算する.

localizationはどのページを置き換えるかクエリごとに決める.各クエリのbuffer poolの汚染を最小化する.

priority hintsではDBMSはクエリ実行の間の各ページの文脈を知っていて,buffer poolはページが重要かどうかヒントを出す.

dirty pages

  • fast
    • buffer poolのページがdirtyでなければ,DBMSは単純にそれを捨てられる.
  • slow
    • dirtyならディスクに書き戻し,その変化が続くのを保証する.

ページテーブルを定期的に読み,dirtyページをディスクに書く.

Other Memory Pools

実装によるが,DBMSはtuplesやindexes以外のもののメモリ必要とする.

結論

DBMSはOSよりもメモリを上手く管理する.

より良い決定をするためのクエリプランについての意味論を使え.

  • evictionis
  • allocations
  • pre-fetching

感想

後はプロジェクトについて.

プロジェクトどうしようかな...

  • clock replacemnt policy
  • buffer pool manager

について実装をする必要があるっぽい.

DBMSって今までやってきたことの総復習的な感じがしますね.

txnってtransactionってことか…