データベースの可視化

クエリでは論理結果と物理的な仕事を分けます。結合は二表を組み合わせ、グループ化は一群を一行に減らし、窓関数は行の同一性を保ちます。索引は訪問ページを変え、B+ 木は順序付きページを管理し、LSM は整理をフラッシュと圧縮へ遅らせ、MVCC はスナップショットに見える版を選びます。

結合は行数を増やし、グループ化は減らし、窓関数は保ち得ます。索引はクエリの意味を変えず、MVCC も規則を変えずに読み取る版を決めます。

レッスンの比較

レッスン入力決定規則落とし穴
SQL 結合二関係キー比較が TRUE の全行対を出し、非一致行は結合種別で決める重複キーは L_k × R_k 行になる
GROUP BY と集約一関係完全なキー組で分け、一群一行を出すNULL があれば COUNT(*) と COUNT(column) は違う
窓関数一関係分割、区内の順序付け、現在行ごとの計算窓の ORDER BY は最終出力順を保証しない
索引ページ付き関係、述語、射影scan、hash、整列済みの葉を選び、非カバーなら RID をたどる低選択性の索引は全走査より多く読む場合がある
B+ 木挿入、探索、範囲内部ガイドで分岐し、葉は区切りをコピー、内部は押し上げるガイドを唯一の記録とみなすと範囲結果を失う
LSM 木版付き put、get、deleteWAL、順序付きメモリー、L0 フラッシュ、最大シーケンスの圧縮tombstone をミスと扱う、または古い run を先に読むと旧値が復活する
MVCC並行取引、論理行、スナップショット新しい版から作成者と上書き版のコミット可視性を確認旧スナップショットが必要とする旧版は、新版のコミットだけでは回収できない

最初の三課は行対、群、パーティション、フレーム、同順位群の論理を示し、物理アルゴリズムを約束しません。索引は冷たいページのモデルで経路を比べます。SQL は結果関係を定め、オプティマイザーが取得方法を選びます。

推奨する学習順序

SQL 結合の LEFT JOIN から始めます。キー 10 の Ada は二つの勤務先と一致して二行になり、20 と 40 は一致せず従業員行を保って右側を NULL にします。同じ入力で INNER は 3、LEFT は 5、FULL は 6 行です。

GROUP BY と集約は GROUP BY region です。交互に並ぶ七販売行が North、South、West になります。North は三行、非空金額は二つで、COUNT(*) = 3、COUNT(amount) = 2、SUM(amount) = 200、AVG(amount) = 100 です。キーを変えると全体一群、地域三群、(region, channel) 六群になります。

窓関数は累積 SUM です。North と South を別々に日順へ並べ、現在行までのフレームを広げ、結果を行 ID に戻します。七行は七行のままです。RANK と DENSE_RANK は同値行に同じ順位を付け、RANK だけが同順位後に欠番を残します。

索引の B+ 点検索は同じ一行を返し、全走査は八ヒープページ、非カバー B+ は三ページ、hash とカバー経路は二ページです。low-selectivity では非カバー木が十二、走査が八を読み、索引を選ばない理由が見えます。

B+ 木は次数 3 へ六回挿入し、連鎖的な分割で三層になります。葉の区切り 30 は上へコピーしても記録は右葉に残り、内部ガイド 20 は新根へ押し上げ、分割後の内部ページから消えます。範囲は一度下降して三つの葉リンクをたどり、10, 15, 20, 25 を返します。

LSM 木は六変更を二つの整列 L0 ファイルにします。memtable の新値と tombstone は旧 L0 値を読む前に探索を止めます。底層までの完全圧縮は六保存版を読み、三つの生きた L1 記録を書き、出力を設置してから入力を退役させます。読み取り増幅の例は重なる三 L0 を残し、欠落キーでメモリーと全三ファイルを調べます。

MVCCの Repeatable Read は T1 の S1={T0} を固定します。T2 が $120 を追加・コミットしても T1 は $100 を読み、後の S2 は T2 を含んで $120 を読みます。回収は S1 の必要性で止まり、T1 終了後に旧版を回収します。更新を同じにして Read Committed へ切り替えると、文ごとにスナップショットを更新し、T1 の三回目が $120 になります。

行数の拡大、縮小、保持から、物理アクセス、二つの順序付き保存法、並行可視性へ進みます。結合で注文を重複させると、その後の集約や窓も重複を数えます。索引や MVCC は、その論理上の誤りを直しません。

注目する点

  • 結合はキー数ではなく行対です。同じキーの左二行と右三行は六行になります。
  • 等値結合の NULL = NULL は TRUE ではなく一致しません。グループ化は複数の NULL キーを同じ群にします。
  • 元行は選んだキー組に一つの所属を持ちます。COUNT(*) は行数、COUNT(amount)、SUM(amount)、AVG(amount) は空金額を無視します。
  • PARTITION BY は計算を再開しても行を潰しません。ROWS は論理位置で伸び、同順位群は窓の順序値の一致で決まります。
  • RANK は欠番を残し、DENSE_RANK は残しません。外側の ORDER BY がなければ、出力順は保証されません。
  • 索引はページを数えます。同一ヒープページの複数 RID は一取得を共有します。hash は等値に使えますが BETWEEN のキー順を保ちません。
  • カバー葉がヒープ取得を省けるのは、現在の射影列を持つ場合だけです。
  • B+ ガイドと等しいキーは右へ進みます。葉の区切りが右部分木の先頭を表すためです。葉分割はコピー、内部分割は押し上げです。
  • 範囲は一度下降して next をたどります。毎回根へ戻ると葉鎖の利点を失います。
  • LSM は WAL がメモリーより先で、フラッシュは到着順でなくキー順です。L0 は新しい順で、値でも tombstone でも止まり、圧縮はシーケンスで版を選びます。
  • 本モデルで tombstone を捨てるのは完全な重なりを最底 L1 まで処理した後です。未選択の旧データを残すと復活させる危険があります。
  • 最新の保存版とスナップショットに見える最新版を分けます。Repeatable Read は最初の文のスナップショットを保ち、Read Committed は文ごとに更新します。
  • 回収は活動中のスナップショットの必要性に従い、最新のコミット残高だけでは決めません。

理解したい層を選び、行対、群、保持行の値、ページ読み取り、B+ のガイドと記録、LSM の変更と版、スナップショットが選ぶ行版という単位を追ってください。