目次
第1章:I/Oとディスクの関係
第2章:Oracleのさまざまなプロセス
第3章:キャッシュと共有メモリ
第4章:SQL文解析と共有プール
第1章:I/Oとディスクの関係
◆DBMSの特性
- 並列処理を可能にし、高スループットも実現する。
- レスポンスを重視する。
- COMMITされたデータは守る
これらの特性は互いに相性が悪い。
- 並列処理を行う場合、データの矛盾を防ぐためにロックが必要になる ⇒ ロックが原因となりスループットが低下する
- データを守るためにCOMMITのタイミングでデータをディスクに書き込む ⇒ ディスクへの書き込みによりレスポンスが悪くなる
◆Oracleの処理概要
①ディスクに格納されているデータの読み込む。
②データの処理を行う。
③ディスクにデータを書き戻す。
◆メモリとディスクの違い
メモリ
処理速度がnsec(ナノ秒)単位と速い(電気信号で処理されるため)。
ディスク
処理速度がmsec(ミリ秒)単位と遅い(機械動作が入るため)。
機械動作:頭出し(シーク) ⇒ 回転待ち ⇒ データの読み書き
したがって、ディスクへのI/OはDBMSにとって必要ではあるが、極力減らすべきものである。
◆シーケンシャルアクセスとランダムアクセス
シーケンシャルアクセス
データの先頭から間を抜かず順を追って(逐次)アクセスすること。
ランダムアクセス
必要なデータが飛び飛びに格納されている場合に、ヘッドを動かしながら(シークしながら)その場所にアクセスすること。
非効率なアクセス方式だが、通常のデータアクセスのほとんどはランダムアクセスとなる。
そのため、DBMSではIOPS(I/O Per Sec:1秒あたりのI/O可能回数)という指標が重要となる。
また、1つや2つのディスクでデータベースを作ってしまうと、負荷が集中した時にシークが追い付かず、ボトルネックになってしまう。
◆インデックス(索引)
キーワードと、それが格納されているアドレスが並べられたもの。
データベースでは、SQL文のwhere句に書く条件の値と、そのキーが存在するアドレスが書かれている。
インデックスのサイズが大きくなった場合は、「インデックスのインデックス」を多段構成(ツリー構造)で作成する。
◆SQL文をインデックスを使って処理する場合の流れ
①where句に書かれているキー値をインデックスの中から調べる。
②対象のキーのアドレス(ROWID)を取得する。
③そのアドレスをもとにデータを読み込む。
④読み込んだデータの中からselect句に書かれている情報を返す。
◆データを守るための仕組み
Oracleのプロセスが異常終了したとしても、データは守られている。
これは、データを変更した後にCOMMIT文を実行することでOracleはディスクにデータを書き出すという仕組みを採用しているため。
第2章:Oracleのさまざまなプロセス
◆Oracleのイメージ
SQL*Plusを含む各種プログラム(Oracleクライアント)と、DBMSであるOracleプロセスは複数存在できる。
Oracleクライアントからの依頼(SQL文)をOracleプロセスが受け、ディスクを使ってデータのやり取りを行う。
データベースを使わないアプリケーションでは、個々のプロセスが自分の持つ変数(データ)を処理するのが普通。
データベースでは、複数のプロセスやユーザが1つのデータベースを共有し、アクセスする。
この「共有」の概念があるため、ロックの仕組みを持っている。
◆サーバプロセスとバックグラウンドプロセス
サーバプロセス
Oracleクライアントに対し、直接サービスを提供するプロセスのこと。
SQL文の受信や解析、実行に伴うデータの読み込み、そして結果の返信を行う。
結果をデータの書き込むことは、時間を余計に使ってしまうため行わない。
バックグラウンドプロセス
Oracleクライアントに対して直接サービスを行うことの無いプロセス。
DBWR(データをディスクに書き込む)、LGWR(ログをディスクに書き込む)、PMON(プロセスを監視する)などがいる。
◆プロセスとスレッドの違い
プロセス
実行状態となっているプログラムのこと。
プロセスは1つ以上のスレッドと、ファイル、ヒープメモリなどのリソースで構成されている。
スレッド
プロセス内に存在する実行単位(CPU利用の単位)のこと。
スレッドはそれぞれが専用のスタックとCPUレジスタのコピーを保持するが、ファイルやヒープメモリは同一プロセス内のすべてのスレッドで共有する。
第3章:キャッシュと共有メモリ
◆キャッシュの目的
処理速度の遅いディスクへのアクセスを減らすために、使用頻度の高いデータをキャッシュと呼ばれるメモリに保存しすぐに使えるようにしておくことで、アクセス(処理)時間の短縮を図る。
◆Oracleにおけるデータのキャッシュ(バッファキャッシュ)の仕組み
バッファキャッシュにデータがおかれている場合
①Oracleクライアントからサーバプロセスに対してSQL文を発行。
②SQL文に必要なデータがバッファキャッシュに置かれていないかを確認。
③バッファキャッシュにデータがあった場合、データを素早く取り出して処理する。
④OracleクライアントにSQL文の結果を返す。
バッファキャッシュにデータがおかれていない場合
①Oracleクライアントからサーバプロセスに対してSQL文を発行。
②SQL文に必要なデータがバッファキャッシュに置かれていないかを確認。
③Diskから必要なデータを読み出す(←ここに時間がかかる)
④読み出したデータをキャッシュにおき、その後SQL分を実行する。
⑤OracleクライアントにSQL文の結果を返す。
◆データブロックについて
Oracleは「データブロック」という単位でデータを管理している。
表やインデックス、I/Oやバッファキャッシュもブロック単位で行っている。
1行だけをディスクから読み込む処理を行う時でも対象の業を含むブロックごとキャッシュに置かれる。
インデックスが1つのブロックに収まらない場合は、複数のブロックで構成される。
◆キャッシュについて
プロセスごとに持っているメモリの領域は、他のプロセスからは見ることが出来ない。
DBMSの場合、異なるOracleプロセス間で同じメモリ領域にアクセスすることが出来る。
このメモリ領域のことをキャッシュまたは共有メモリという。
Oracleでは、共有メモリ領域のことを「SGA(System Global Area)」、共有でないメモリの一部を「PGA(Program Global Area)」と呼ぶ。
複数のOracleプロセスから共有メモリにアクセスする時にデータが壊れることを防ぐために、ロック機能を設けてデータを保護している。
第4章:SQL文解析と共有プール
最終更新:2012年12月22日 18:09