Oracleの役割、プロセスに触れる
Oracleについて学習する
こんにちは!わいわわです。
本日はDBMSのOracleについて、学習していこうと思います。
エンジニアとして活躍していく際には必須スキルで、
今年中に基本情報技術者試験とOracle Shilberを取得したいと考えているので、頑張ります!
Oracleとディスクの関係
Oracleはデータベース管理システムです。
データベースやデータベース管理システムは以前まとめました!
また、Oracleにおけるデータベースとは
Oracleの管理下でディスク(ハードディスク)に入っているデータのことです。
Oracleはディスクからデータを読み込み、処理をして、ディスクにデータを書き戻します。
イメージとしてはOracleが取り扱うデータはディスクから取り出され、ディスクに戻ります。
ディスクはほぼ常に回転していて、
その上をヘッドが動いてデータを読み書きします。
レコードプレイヤーと似ている、という感じです!
I/O処理の時の動作
I/O処理とは...Input/Outputの略で「入出力」を意味するワード
I/O処理のディスクの動作を学習していきます。
データを読むためにはいわゆる頭出しをしなければなりません。
この目的の位置を探す作業をディスクの用語ではシークと呼びます。
その後、さらにほしい情報が回転してくるまで待ちます。
この待ち時間を回転待ち時間と呼びます。
そしてようやくデータを読み書きするイメージです。
メモリに対するアクセスはnsec(ナノ秒)の単位で行えるのに対して、
ディスクに対するアクセスはmsec(ミリ秒)の単位で時間がかかります。
人間の時間間隔からすれば素早く動作するように感じられますが
コンピュータの速度からするととても遅いようです。
I/O待ち時間とインデックス
シーケンシャルアクセス…順を追って先頭から間を抜かさずにアクセスすること
フルスキャンした際に、メモリにデータがないとシーケンシャルアクセスが発生します。
フルスキャンとは、表の全てのデータを読み込むことです。
時間がかかってしまうとSQLの性能要件を満たすことができません。
そこでインデックスが登場します。
本データベースのインデックスには検索の際に使用するキー値と
そのキーが存在するアドレスが書かれています。
アドレスは正確にはROEIDといいます。
Oracleはこのアドレスがわかればディスクに対して具体的に読み込む場所の指示ができます。
具体的にこの指示はWHERE句やSELECT句に記載することで指示ができます。
SELECT "所属会社"
FROM "個人データ"
WHERE "個人名" = "濱崎"
;
WHEREで指定した"濱崎"のアドレスを得られるので、
そのアドレスをもとにデータを読み込み、"所属会社"のデータを返すイメージですね。
これで速く動作しますね!
ランダムアクセスについて
インデックスを使うと、必要な箇所だけ読めれば十分ですが、
必要な箇所がディスク上で連続していることはほとんどありません。
そのため、ヘッドを動かしながらとびとびにアクセスすることになります。
このようなアクセスをランダムアクセスと呼び、
シーケンシャルアクセスとは反対の意味を持ちます。
なので、すべてにおいてインデックスが有効とは限らないんですね!
データの保証
Oracleを操作した際、プロセスが異常終了してもデータは大丈夫です。
ここがDBMSと他のプログラムとで異なるところです。
例をあげるとExcelですが、こちらは保存した時点以降のデータは失われます。
それに対してDBMSはCPUが壊れてもメモリが壊れてもデータを失うわけにはいかないため、
COMMITと入力するとOracleはディスクにデータを書き出しています。
Oracleの役割
上述した通りDBMSのOracleですが、
役割としては各種プログラムからSQL文とその結果というデータをOracleが送受信し、
ディスクを使って管理するということが、役割のイメージです。
データベースを使わないアプリケーションのプログラミングは個々のプロセスが自分の持つ変数を処理することが普通です。
そのため、のプログラムのことを考えずに複数の人がデータを触っても問題がありません。
しかし、データベースはそうはいきません。
複数のプロセスやユーザーが1つのデータベースにアクセスするためです。
SQLは長いものでは数時間に処理が及ぶこともあります。
その間、ほかのユーザーを待たせるわけにはいかないため、
複数のプロセスから成り立っています。
I/O処理が繰り返されている間にCPUなどのリソースがもったいないという意味もあります。
また、Excelは基本的に個人で操作するものですが
DBMSは複数のユーザーはもちろん、複数のアプリケーションでも操作できます。
Oracleのプロセスの構成
Oracleは次の2つのプロセスで構成されています。
・サーバープロセス(SQL文を処理するプロセス)
・バックグラウンドプロセス(主にサーバープロセスを助けるプロセス)
Oracleクライアントはサーバープロセスと通信します。
そのため、サーバープロセスは一般の会社でいう「お客担当」に相当するわけです。
そしてそのお客担当をサポートする各種裏方がバッググラウンドプロセスというイメージです。
各プロセスが行う処理
1.SQL文の受信
2.SQL文の解析
3.データの読み込み
4.データの書き込み
5.SQL文の結果の返信
6.ログの書き込み
7.各種掃除
8.ログの保存
Oracle内で行われている主な処理が上記のとおりです。
SQL文の結果返信に必要な処理は
1.SQL文受信
2.ディスクの読み込み
3.結果送信
この間、サーバプロセスがSQLの実際の処理を実行しています。
原則的な各プロセスの役割担当としては
SQL文の結果を返すために必要なものはサーバプロセスが行い、
それ以外はバックグラウンドプロセスが行うというイメージです。
このようにすることで効率を上げています。
本日のまとめ
・ヘッドが動き、さらに回転待ちをするため、I/Oに時間がかかるイメージ
・インデックスにより、該当データにすぐアクセスができる
・データベースはみんなで共有することに長けている
・アプリケーションやSQL*PlusといったOracleクライアントが複数存在し、複数のSQL文がOracleに渡されるイメージ
・Oracle上で複数のSQL文が同時に動くイメージ(PC上のExcelとは違う)
・サーバープロセスを助けるバックグラウンドプロセスが存在する
今日はOracleについて基礎の部分やプロセスの種類などを学習しました。
基礎の部分ですが、イメージをつかむことができました。
Oracleはエンジニアとして必須のスキルなので
引き続き学習を進めてまいります!
Discussion