lasciva blog

開発して得た知見やwebビジネスのストック

「RDBMS解剖学」を読んだ

RDBMS解剖学 よくわかるリレーショナルデータベースの仕組み (DB Magazine Selection)

RDBMS解剖学 よくわかるリレーショナルデータベースの仕組み (DB Magazine Selection)

目的、モチベーション

  • DBの処理の一連の流れを俯瞰して理解したい
  • 特に、実行計画やトランザクション管理など

全体の感想

SQLを解析して、どのようなプランでデータを制御し、トランザクション排他制御、マルチバージョンをどのように行うかなどを俯瞰的に解説されてました。
SQL周りは特に目新しい情報もあまりありませんでしたが、特にトランザクションの制御やログなどはなかなか基礎的なところから説明した書籍等があまりないので、重宝しました。
廃版になってしまってるので手に入れにくいですが、DBの中の基礎知識がない方にはオススメです。

目次

概要

第1部 はじめに

全体の処理の種類や流れは以下の図のように整理できる。

f:id:hacking15dog:20191007180715p:plain

Chapter 1 データベースの基礎とディスクアクセス

ディスクはメモリと比べて安価だが、数万とかのレベルで遅い。

第2部 SQLの処理

Chapter 2 SQLをどう料理するか(1) SQL構文解析

構文を解析して、構文ツリーを作成する。

Chapter 3 SQLをどう料理するか(2) SQLから演算へ

論理プラン: SQLを操作手順に解釈して、代数の演算に変換し、どれが効率的に行えるか選択する
物理プラン: 論理プランをコンピュータ上の実行手順に書き換えたもの

Chapter 4 カタログとインデックス

カタログとは
  • データベース情報
  • テーブル情報
  • ビュー情報
  • カラム情報
  • インデックス情報
  • 制約情報
  • データベースユーザ情報
  • 統計情報(カラムの最大値、最小値、種類数など)
  • ストアドプロシージャ/トリガー情報
  • 性能情報

重要な用途は、「SQL構文解析の整合性チェック」と「最適プランの選択」。

Chapter 5 SQLの実行エンジン

テーブルスキャンやマージの種類が複数紹介されていた。
これらのアルゴリズムとカタログ情報から最適なプランを評価する。

Chapter 6 物理プランの生成

物理プランの最適化方式

有名なものは2種類ある。

ルールベース方式
事前に優先順位のルールを用意して、選択する。
テーブルの容量等が考慮されていないため、データの増減などの環境変化に対応できない。

コストベース方式
各統計情報から、「コスト」と呼ばれる最適化のための指標を算出して、最小なプランを選択する。

コストベース方式の例

第3部 システム化のサポート

Chapter 7 トランザクションの基礎

トランザクションをどのように保証するか

追記型では、古い値と新しい値を保持して、COMMITやROLLBACKの時点でどちらかを無効にする。
そのため、更新時には対象データの容量だけ余分にストレージが必要になる。

同時実行制御~複数のトランザクションが同時に実行される場合~

パフォーマンスを出すには平行して処理する必要がある。
一方でトランザクションが干渉しあうと、次のような問題が発生するので制御する必要がある。

  • 更新の消失
  • ダーティーリード
  • 非再現リード

Chapter 8 トランザクション制御とMVCC

インデックスなどの内部ロック

Bツリーの場合はルートノードからリーフノードを探索するため、二相ロックに従うと一連のノードをロックしなければならない。
そのため、ツリープロトコルで実装されることが多い。

  1. あるノードのロックを獲得
  2. ロックを獲得しているノードの子ノードのロックだけ獲得できる
  3. 個別のノードのロックはいつでも解放できる(ほかのトランザクションがロックできるようになる)
  4. いったんロックを解放したら、このノードのロックは獲得できない
タイムスタンプを使った同時実行制御

ロック以外の方法の一つとしては、タイムスタンプをそれぞれのトランザクションに発行して、その順番を使って強制的に実行を制御することができる。
タイムスタンプの順番に従ってない場合はabortする。abortが連鎖することもあり、あまりよろしくない。

マルチバージョン同時実行制御

マルチバージョン同時実行制御(MVCC)は、タイムスタンプをベースとしている。
タイムスタンプでは、結果が正しくても実行順序に問題があると強制的にアボートされてよろしくない。
この問題に対して、古いデータを保持しておいて、トランザクションの一貫性を担保する。
データの書き込み中にも、古いデータを返すことで並列で処理を行える。

Chapter 9 ログ機能によるパフォーマンスの向上

データ更新処理の仕組み

ログファイルに書き込んだらcommitされる。
この時点では、データファイルにはまだ保存されていない。

ログ機能の構成と役割

パフォーマンス改善と、バックアップの2つの側面がある。

性能上の課題

ログの書き込みは、シーケンシャルなので、都度データファイルに書き込むよりもパフォーマンスがよい。

ディスクへの書き出しの性格の違い

バイナリログと実データのディスクを分離すると、ディスクヘッドのオーバヘッドが減り、パフォーマンス改善につながる。
複数のトランザクションを1度に書き込める可能性がある。

Chapter 10 ログによる障害からの復旧

データファイルへの書き込み記録であるチェックポイントをもとに、復旧時にREDOなどを行う

第4部 複数データベースをまとめる

Chapter 11 クラスタリングによる性能向上

Chapter 12 データベースのパーティショニング

パーティションを行うことで、各ノードでの全データアクセスのデータ量が減るので、パフォーマンスが上がる。
一方で、どのようにパーティションを行うか、どのレイヤーで制御するかなどの複雑性が上がるので、キャパシティプランニングが非常に重要。
また、パーティション間のデータを結合する際には余計にコストがかかる場合もあるので、設計も重要。

次のアクション

RDBMS解剖学 よくわかるリレーショナルデータベースの仕組み (DB Magazine Selection)

RDBMS解剖学 よくわかるリレーショナルデータベースの仕組み (DB Magazine Selection)