Open4

SQL実践入門 - メモ

KDDKDD

1. DBMSのアーキテクチャ

以下特に重要な要素

クエリ評価エンジン

SQLの解釈をするDBMSの脳。クエリの評価に基づいて実行計画を決定する。
実行計画をアクセスメソッドにわたす。クエリのパフォーマンスを考える上でとても重要。

バッファマネージャ

メモリ領域の管理を行う。ディスク容量マネージャと連携。

ディスク容量マネージャ

どこにどのようなデータを保存するかを管理する。DBはデータを永続的に保持する必要がある。

トランザクションマネージャ&ロックマネージャ

DBのトランザクションを管理。必要に応じてロックを掛け、データを矛盾なく保つ。

リカバリマネージャ

障害などに備え、定期的にデータをバックアップし、いざというときに復旧させる。

KDDKDD

1.2バッファ・・・短期記憶と長期記憶のトレードオフ

記憶装置には向き不向きがある。

アクセス高速(記憶コスト高)


一時記憶装置(レジスタ、メモリ)

二次記憶装置(HDD、フラッシュメモリ)

三次記憶装置(テープなど)

アクセス低速(記憶コスト低)


HDD

DBMSのデータは永続性やコスト、容量などのコストパフォーマンスの面からHDDに保存することがほとんど。
スピードをある程度犠牲にする代わりに、テラバイトなどの大容量のデータをコストを抑えつつ保存することが可能。

メモリ

記憶コストが高いが、一時的かつ高速な記憶が得意。
DBMSの場合でも、よほどのことがない限りは100GB以下しか載せない。

DBMSにおけるメモリの使われ方

ユーザーとディスクの間にメモリを設置し、頻繁にアクセスされるデータをメモリに保持しておくことで、ディスクにアクセスすることなくデータを返すことができる。

このようにディスクに対する緩衝材のような目的で設置されたメモリを「バッファ」「キャッシュ」と呼ぶ。

KDDKDD

バッファの種類

呼び方は各DBMSによって様々。

データキャッシュ

ディスクにあるデータの一部を保持する。
SELECTに対して、メモリ内にデータが有ればそれを返す。なければディスクに取りに行く。

ログバッファ

主にINSERT、UPDATE、DELETEなどの更新系のクエリを溜める。
DBMSにおいて更新は時間がかかるために非同期で行われ、ログバッファへの書き込み(コミット)のタイミングでユーザーには更新処理の終了を通知している。

メモリはとても便利だが、揮発性があるため永続的なデータを保管できない。

ワーキングメモリ

データキャッシュやログバッファとは別の領域にあり、ソートや結合(ハッシュ)などで用いられるメモリ。
ソートの際にデータ量が大きすぎてこのメモリから溢れた場合、ストレージの一時領域を利用(=極端に遅くなる)してクエリを実行する。これをTEMP落ちと言う。

KDDKDD

実行計画とクエリ評価

①パーサ

構文解析を行い、文法が正しいかチェックする。
文法に問題がなければ定型的な文に変換。コンパイルのイメージ。

②オプティマイザ

最適化を行う。カタログマネージャと連携して複数のプランを生成、それぞれの計算量を算出し、もっともコストの低いものに絞る。

③カタログマネージャ

テーブルやインデックスの統計情報が格納されている。オプティマイザが最適化を行うための統計情報を提供する。

④プラン評価

オプティマイザが算出した実行計画を評価する。

適切な実行計画が選択されるためには、データが大きく更新された際に統計情報の更新を行うこと。

統計情報更新コマンド

MySQL
ANALYSE TABLE スキーマ名.テーブル名;
PostgreSQL
ANALYSE スキーマ名.テーブル名;

実行計画確認

MySQL
EXPLAIN EXTENDED SQL
PostgreSQL
EXPLAIN SQL