【SQL】DBMS 内部アーキテクチャ
DBについて復習しようと思いました。なので、 「SQL 実践入門 (技術評論社)」という本を参考にメモがてら書きます。
SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)
- 作者: ミック
- 出版社/メーカー: 技術評論社
- 発売日: 2015/04/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (7件) を見る
今回は1章の内容です。
RDB(Relational Database)製品には、Oracle、Microsoft SQL Server、DB2、PostreSQL、MySQLなどが存在する。 MySQLがよく日本では業務をする上で目にしたり、聞いたりするだろう。 内部のアーキテクチャはどれも同じというわけではない。しかし、RDBという枠組みでは基本は一緒、主な概要を抑えておけばよいだろう。
クエリ評価エンジン
ユーザから受け取ったSQLを解釈し、いかなる手順で記憶装置のデータへアクセスするべきか決定する。(実行プラン) この計画に基づいたデータへのアクセス方法がアクセスメソッド。
バッファマネージャ
メモリ領域の使い方を管理する。 ディスク容量マネージャと連携しながら動く。
ディスク容量マネージャ
どこに、どのようなデータを保存するかを管理する。 それに対する、読み込みと書き込みを制御する。
トランザクションマネージャとロックマネージャ
DBMS内部では、トランザクション
という単位で個々の処理が管理される。
このトランザクション同士をデータの整合性を保ちながら実行させたり、データにロックをかけて待機させたりという機能です。
リカバリマネージャ
いざという時にデータの復旧(リカバリ)すること。
記憶装置
- HDD
データを保存するストレージ。 ほとんどの場合は、容量、コスト、パフォーマンスなどという点からHDDあ選択されているでしょう。
- メモリ
DBMSは常にディスク以外にもデータを持つようにしている。それがメモリです。
記憶コストが高く、1台のハードに搭載できる量は多くはない。
頻繁にアクセスされるデータをうまくメモリ上に保持しておくことができると、
SQL文を実行した際、パフォーマンスの向上が見込める。
パフォーマンス向上とする目的でメモリのことをバッファ
やキャッシュ
と呼ぶ。
メモリ上の2つのバッファ
- データキャッシュ
ディスクにあるデータの一部を保持するためのメモリ領域。
- ログバッファ
更新処理(INSERT,DELETE,UPDATE,MERGE)の実行に関係する。 更新処理は、すぐにストレージ上のデータに変更をかけているわではなく、 更新情報をログバッファに一時溜めている。
トレードオフ
データキャッシュに比べてログバッファの設定値が非常に小さい。 これはDBが基本的に検索をメインとして想定しているからだ。 最近のDBMSは自動でメモリの割当をしているが、よりタスクが大規模化したり、細密化していけば どのような思想に基いてリソース配分が行われているか、行わなければならないのかは知っておく必要がありそうです。
ワーキングメモリ
ソートやハッシュなどの特定処理に利用される作業用の領域。 (ワークバッファやソートバッファなどと呼ばれる)
データへのアクセス方法はどのように決まるのか
さきほども出てきたクエリ評価エンジン
でアクセスを決める。
流れとしては以下。(上から下へ)
SQL | parser | optimizer--> catalog manager | plan evaluation
- パーサー
構文解析。 受け取ったSQLを要素毎に分解しDBMSが処理しやすいように変換する。
オプティマイザ パーサーからきたクエリをもとにデータアクセス方法を決定する。 インデックス有無やデータの分散や偏りの度合い、内部のパラメータなどの条件を考慮し計画を作成、 コストを計算して、最も低コストは1つに絞り込む。
各テーブルのレコード数 2.各テーブルの列数と列のサイズ
- 列値のカーディナリティ(値の個数)
- 列値のヒストグラム
- 列内にあるnullの数
- インデックス情報
上記の情報をもとに実行計画を作成するわけだが、このカタログ情報が実際のテーブルやインデックスと一致しない場合。その場合は統計情報を更新する必要とある。(例:ANALYZE) 運用しているとANALYZEをするタイミングも重要ですが...w
- カタログマネージャ
DBMS内の内部情報えお集めたテーブル群で、テーブルやインデックスの統計情報が格納される。(統計情報)
- プラン評価
オプティマイザから受け取った実行計画で、最適な実行計画を選択する。
おわり
と、いった具合でDMNSのアーキテクチャをざくっとかいてみましたの巻。