データベースの可視化
クエリでは論理結果と物理的な仕事を分けます。結合は二表を組み合わせ、グループ化は一群を一行に減らし、窓関数は行の同一性を保ちます。索引は訪問ページを変え、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、delete | WAL、順序付きメモリー、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 の変更と版、スナップショットが選ぶ行版という単位を追ってください。