【DBMS入門】DBMSが目指している姿
【学習のきっかけ】
■簡易なSQLは書けるけどDBMSってなにしてるんだろうか
SQLは非手続き言語。「データをどのように取ってくるか」などのHOWの部分を指示する必要がない。
なにをとってくるかだけ指示すればDBMSがなんとかしてくれる。
少しSQLになれてくると
・DBMSってなにをしてるんだろー
・なぜ処理結果は同じなのに指示の仕方によって実行速度が異なるのか
などDBMSの中身の処理に疑問を持つようになった
【内容】
■DBMSの目指す姿・思想・哲学
以下の3つを目指していることを考えると、いろんなことがうなづける、はず
①早いレスポンスの実現
②並列処理の実現しつつ、高スループット(複数人でDBを利用できる(検索・登録・削除・変更))
③COMMITされたデータは守る
※「Oracleの仕組み」より引用
■並列処理の実現しつつ、高スループット
並列処理の実現しつつ、高スループットを実現するために
①クライアントからの更新処理依頼はまとめてディスクに書き込む
メモリのアクセス速度に比べて実際のDBファイルがあるディスクへのアクセス速度は遅い
よって、なるべくディスクへのアクセスを減らしている。
ちなみに、まとまった更新処理を行うタイミングを「チェックポイント」と呼ぶ
②バッファキャッシュを使用するかつバッファキャッシュをプロセス間で共有にする
あるデータがディスクのどこにあるかといったデータなどをキャッシュとして
メモリとして保存しておく。それにより、再度同じデータへのアクセスがあった
時に処理速度が早くなることが期待される
それをプロセス間で共有する。
③SQLの解析情報(実行計画)をプロセス間で共有にする
実行計画とは、SQL文を解析してどのような順序で処理を実行すると
最も効率的なのかを計画したもの。
このSQLの解析から実行計画をたてる際、CPUのリソースの消費が大きい。
よって、同じような問い合わせ(select文とか)であれば、以前の実行計画を
利用する。それにより、処理速度が速くなることが期待される。
ちなみにプロセス間で共用するSQLの解析情報は共有プールに存在する。
■COMMITされたデータは守る
COMMITされたデータは守るために
①トランザクションログファイルをディスクに残す
ユーザが更新処理の終了をRDBMSから受け取っていても、ディスクにあるDBファイル
が更新されているわけではない。更新処理を行われているのは、メモリにあるメモリバッファ。
※理由はレスポンスを早くするためにディスクへの書き込み頻度を減らすため。
更新処理がメモリバッファのみであると、障害発生時、ディスクに書き込まれていない更新処理は
ディスクに反映されず失われてしまう。
そこで更新処理のログ(SQL)をディスクに保存しておく。
このトランザクションログファイルをもとにCOMMITされていた内容を保障する