俺には勉強しかない

140字のその先

【文系エンジニアにならないために】『絵で見てわかるOracleの仕組み』書評

Webアプリケーションを開発していく上で避けては通れないのが「データベース」だ。
そもそも、Webアプリケーションというのは結局のところ、やってる事は
データを表示する」「データを追加する」「データを編集する」「データを削除する
の4つしかなく、これらはほぼ全てデータベースを介して行われる。
そして、そのデータベースを管理するシステムを「DBMS(DataBase Management System)」と呼ぶ。
今回取り上げるOracleDBMSの一種だ。実際にはDBMS≒データベースと捉えてしまって構わない。

プログラマーとして働いている内は、データベースについて深く考える機会は少ない。
自分もつい最近まで「データを突っ込んでおくための箱」くらいの雑な認識だった。

勿論、正しくデータを操作するためにどんなSQL文を書くべきかについては、考える機会が多い(それはプログラマーの仕事だ)。

しかし、SQLがどのように解釈され実行されるか、
登録したデータはどのように保存され、障害時にはどのように復旧されるか等、
DBMS内部の処理について考える機会は少ない。

プログラマーならまだいい。しかし、SEとなるとそうはいかない。
高パフォーマンスのシステムを設計するためには、DBMSの知識は必須だ。
Webアプリケーションの処理速度はデータベースの性能でほぼ決まるからだ。

自分はいずれSEになって上流工程をやりたいと思っているので、代表的なDBMSであるOracleについての学習を始めた。
とはいっても、業務でOracleをいじる機会がなく、処理のイメージがつきづらかったので、
Oracle関連の書籍で一番簡単そうだったこの本を手に取った。


読もうと思ったきっかけ

今年2月末に受けるOracle Master Silver 12cに向けての受験勉強を始める前に、入門レベルの知識を身に着けたかった。

それと、冒頭にも書いたけど、自分はWebアプリケーションの本質はデータベースだと考えていて、
Webエンジニアとしての技術を追求すると、最終的には「データベース」と「セキュリティ」に行き着くと思っている。

Webアプリ内のロジックは、フレームワークとライブラリの説明書をよく読んで、上手いこと使いこなせば何とかなるからだ。
それに、「Low-Coding」「No-Coding」の流れは今後ますます強くなっていって、
ビジネスロジックを自分で書く機会は減っていくだろう。

それなら、より本質に近い、ロジックと違って自分で理解し考えなければならない「データベース」と「セキュリティ」を学んだ方がお得だろう。
それに、データベースの知識・技術はコーディングスキルと掛け合わせても強いし、クラウド等のインフラ周りのスキルと掛け合わせても強い。

感想

分かりやすいが、入門ではないが率直な感想だった。

「文系エンジニアと呼ばれる暗記に頼るエンジニアではなく、アーキテクチャと動きを理解して応用力のあるエンジニアになって欲しい
という著者の強い意志を読んでいて感じた。

事実、アーキテクチャと動きを理解するための本としては、(オライリー出版の本などと比較して)非常に平易に分かりやすく書かれている。

しかし、文系エンジニアである私は、始めから「一番重要な箇所だけ暗記してやろう」という
著者が最も取って欲しくないであろう態度でこの本を読み始めた。

そのため、Oracleアーキテクチャの精緻さ、著者が随所に仕掛けた「自分の頭で考えさせる」ためのギミックによって、
読み進めるのにかなり苦戦した。

また、「絵で見てわかる」とタイトルにあるが、実際に載っているのは図である。

絵というものは、頭を使わなくても瞬時に理解できるものだ(芸術作品を除く)。
例えば、下の双葉杏の絵を見れば、全人類が瞬時に「かわいい」と理解できる。

f:id:adhdoutism:20200806172452j:plain
anz

しかし、図はそうはいかない。
下の図はOracleアーキテクチャを表した図だが、これを見て理解するためには、
前提知識と、理解しようという意志が必要だ。

https://docs.oracle.com/cd/E57425_01/121/CNCPT/img/GUID-A30AF38A-7D55-4987-A0FB-02BAAF079AC5-default.gif


その意味では、この本のスタンスは矛盾しているといえる。
「絵で見てわかる」というタイトルで自分の頭で考えたくない読者を引き寄せて、
自分の頭で考えて理解する事を求めているからだ(あるいは、そういう読者を改変させるために敢えてそうしたのかもしれない)。

ちなみに、絵ではないものの、この本に載ってる図は分かりやすかった。

この本を読んだ方がいい人

Oracle Master Silver 12c受験者

この本を読む事が得点UPにつながる事はないかもしれないが、
アーキテクチャと動作を理解する事によって、学習の効率が上がる事は間違いない。

業務でOracleを使用しているエンジニア

「OLTP系システムにおいて待機イベントが多く、CPU使用率が高い場合、どこを確認する?」
「チューニングをする際、まずどこのプロセスを確認する?」
等、実務寄りの解説も多いので、新人DBAは読む価値があると思う。

学んだ事

Oracleを理解するための3つのキーワード

Oracleを理解するためには、まずOracleに何が求められているかを知る必要がある。
特に気を付けたいのは、これらの要求事項は
トレードオフ(どちらかを取るとどちらかが成り立たなくなる)
であるという事だ。

例えば、データを絶対に保存するために、
COMMITする度に一々ディスクに書き込んでたら、
レスポンス速度は遅くなってしまう。

なので、Oracleはこの無茶ぶりにどう応えているのか、という視点を持つと、アーキテクチャと動きが理解しやすくなる。

「即レス」

まず何と言っても速度。遅かったら使い物にならない。

「並列処理」

人間で言う所のマルチタスク
一度に一つの事しか出来ないよりは、同時に複数の事が出来た方が効率が良い事は、何となく想像出来るだろう。
並列に処理をした方が速度が速いのは勿論、CPU等のリソースも無駄なく使う事が出来る。

「データ死守」

DBMSはどんな事があっても、一度COMMITされたデータは確実に保存しなければならない。
例えCPUがぶっ壊れても、雷が落ちて停電しても。

ハードディスクは、遅い

ハードディスクへのアクセスは、メモリへのアクセスの1000000倍遅い。
メモリアクセスはナノ秒単位だが、ディスクアクセスはミリ秒単位だ。

なので、Oracleはディスクアクセスを出来るだけ少なく、かつまとめて行うように設計されている。

Oracleアーキテクチャ

Oracleアーキテクチャを、ディスクとメモリに分けて雑に説明する。

メモリ

Oracleでは、メモリに常駐するものを「インスタンス」と呼ぶ。
インスタンスは、「SGA」と「バックグラウンドプロセス」に大別される。

SGA

System Global Area の略。全プロセスが共有しているメモリ領域で、
取得したデータのキャッシュや、SQLの解析結果が格納される。

バックグラウンドプロセス

主にSQLの解析を行うサーバプロセスの手助けをする、裏方プロセス。
本書では、サーバプロセスは実際にお客さんと接する営業、
バックグラウンドプロセスは事務員や倉庫作業員に例えて説明している。

裏方といっても、先述した無茶ぶりを成り立たせているOracleの主役的存在。
これのおかげで、Oracleは並列処理を実現出来ている。

ディスク

データファイル

実際にデータが登録されているファイル。
Oracleが使用するデータと、Oracleを使用するユーザーのデータ両方が保存されている。

REDOログファイル

データベースに対して行われた全ての更新情報が記録されているファイル。
これがあるお陰で、Oracleは何かあった際にすぐにデータを復旧出来るし、
レスポンス速度を高速化出来る。

制御ファイル

Oracleが管理する全てのデータファイル、REDOログファイルの位置情報が保存されている。
これを読み込むと(マウントと呼ぶ)、OracleはDB内に登録されているデータにアクセス出来るようになる。

SQLプログラミング言語の決定的な違い

それは、プログラミング言語と違い、SQLは「処理方法を記述しない」ことだ。
下のSQL文を見て欲しい。

SELECT A FROM B
    WHERE C = 1;

これは、「Bという表から、C列が1の行のA列を取得する」というSQL
どこにも「インデックスを使う」とか「このデータファイルにアクセスする」などの
具体的な処理が書かれていない。

そのため、Oracleはユーザーから送られてきたSQLを解析し、
どのように処理するかを計画してから処理を行う(これを実行計画と呼ぶ)。

自分はこれを知って、SQLの見方が根本的に変わった。それくらい衝撃だった。

いかに素早くレスポンスを返すか

インデックス(索引)を使う

例えば本で何か調べものをする時は、先頭から1ページずつ読んで探すよりも
索引を使ってキーワードから該当ページを探した方が効率が良い。

それと同じように、Oracleはデータを検索するためのインデックス(索引)を作る事によって、
データへのアクセスを高速化している。

キャッシュを使う

同じデータを何度もディスクから取得するのは非効率だ。
Oracleは、使用頻度が高いデータを、データベースバッファキャッシュと呼ばれる領域に格納する。
データを利用する時は、ディスクからではなく、このキャッシュから取得する事で処理を高速化している。

データは後で書き出す

データをディスク内にリアルタイムに書き込もむと、利用者は書込みが完了するまで待たなければならない。
そのため、Oracleはログだけをリアルタイムで書込み、
データの書込みは裏でバックグラウンドプロセスにやらせる事によって、
レスポンス速度を向上させている。

終わりに

自分は私立大学の文系学部卒だ。しかし、「文系エンジニア」にはなりたくない。
どうせなら、自分が仕事で使っているツールの仕組みくらいは把握していたいと思う。

最後に、著者のあとがきを引用させて頂く。

本書のように、一般的なITの観点からアーキテクチャや動作を学ぶことは、遠回りのように見えて一番の近道です。
みなさんの成長に少しでも役立てれば本望です。


絵で見てわかるOracleの仕組み (DB Magazine SELECTION)


【中古】 絵で見てわかるOracleの仕組み アーキテクチャと動作を徹底図解 /小田圭二【著】 【中古】afb