図1●クライアント/サーバー型システムの構成例
図1●クライアント/サーバー型システムの構成例
[画像のクリックで拡大表示]

 「データベースはブラックボックス。どんなSQL文を投げたらどんな結果が返ってくるかさえ知っていればよい」---そう思っている人も多いかもしれません。確かに,最近の市販のリレーショナル・データベース管理システム(RDBMS)にはGUIベースの管理ツールなどが付属し,データベースそのものについての深い知識が求められることは昔に比べれば少なくなりました。メモリーやディスクなどのハードウエア・リソースが増えて,開発者のスキル不足が表面化しにくくなったこともあるでしょう。

 しかし,本物のソフトウエア・エンジニアを目指すのであれば,データベースが動く仕組みを学ぶことは避けて通れません。「SQL文を受け取ってから結果を返すまでにRDBMSがどんな処理をしているのか」「データ・ファイルの物理構造はどうなっているのか」「インデックスはどのように格納されているのか」——。こうした知識がないと,パフォーマンスなどに問題が生じたときどこから手を付けていいのか皆目見当がつかない,といった事態に陥りかねません。知らず知らずに効率の悪いデータベース設計やパラメータ設定をしたり,SQL文を記述してしまうことも多くなるでしょう。

 市販のRDBMSの内部はかなり複雑ですが,基本的な部分を理解するのはそれほど難しくありません。この特集でデータベースの動く仕組みを理解してください。

 データベースは,多くの業務アプリケーションで不可欠なソフトウエアです。商品受発注システム,在庫管理システム,顧客管理システムといった企業の基幹系システムの中核には,必ずと言っていいほどデータベースが据えられています。データベースに関するスキルが無くては,企業システムの構築・運用には携われない,と言っても良いでしょう。

 一方で,企業システムでトラブルの原因になることが多いのもまた,データベースです。例えば,入力してから応答が返ってくるまでに時間がかかりすぎて使いものにならない,というのは,業務アプリケーションのトラブルでもっともよく見られる事例の一つです。こうしたトラブルは,検索に使っているSQL文で,「データベース側でどんなことを実行しているかをよくわかっていなくて効率が悪い処理を書いてしまった」ことが原因である場合も多いようです。

 (図1[拡大表示])を見てください。これは,クライアント/サーバー型システム全体を模式的に表したものです。真ん中にある黄色の四角の部分がデータベースを管理する,いわば頭脳となるソフトウエア「リレーショナル・データベース管理システム(RDBMS)」です。RDBMSを表す四角の中に,最適化とか,トランザクションとかいくつかの言葉が並んでいます。それぞれがどんな仕組みで,どんなことをしているかを言うことができますか? 「簡単だよ」という人も,ちょっと詰まってしまったという人も,もう少しお付き合いください。

適切な指示を出すにはまず相手を知ることが大事

 RDBMSは大きく分けて,(1)SQL文の解釈などを実行する部分と,(2)ディスク・アクセスなどを管理する部分の二つで構成します。ここではそれぞれ,リレーショナル・エンジン,ストレージ・エンジンと呼ぶことにしましょう。

 リレーショナル・エンジンは,アプリケーションから受け取ったSQL文を解析し,文法チェックなどをしてから最終的にRDBMS内部で行う処理単位に分割します。この過程で,SQLを高速に実行できるように最適化も行います。例えば,推論によってSQL文を書き換えたり,統計的な情報を基にテーブルをアクセスする際にインデックスを使うべきかどうかを検討するなど,実際にディスクにアクセスをする前の準備としてさまざまな処理を行います。そして最も効率がよいと思われる内部処理命令の組を自動生成してくれます。

 「そんなにいろいろなことをしてくれるんだったら,全部リレーショナル・エンジンに任せてしまえばいいんじゃないの」という声も聞こえそうですね。でも,そうはいきません。例えばリレーショナル・エンジンは,人間が考えれば明らかに効率が悪いと思われる処理方法を,推論の結果わざわざ選んでしまうこともあります。検索を高速化するために定義しておいたインデックスを使ってくれない,ということも起こります。そうしたことがないようにするには,一体どうすればよいのでしょうか。

 それには,リレーショナル・エンジンが効率の良い処理をするように,ユーザーやアプリケーション側から出す命令を修正してみたり,指示を与えてやれば良いのです。ただし,やみくもに命令を修正したり,指示を与えても効果はありません。リレーショナル・エンジンがどのような仕組みで動いているかを知っていないと,適切な指示はできません。これは,スポーツのコーチが選手を適切に指導して実力を発揮させるには,相手の特性や性格を知っていなければいけないのと同じです。本特集のPart1をお読みいただければ,リレーショナル・エンジンのこうした点を理解できるはずです。

データがどう格納されているかを把握しておくことも重要だ

 RDBMSのもう一つの構成要素であるストレージ・エンジンは,リレーショナル・エンジンから受け取った処理命令を基に,ディスクにアクセスしてデータを読み込んだり書き込んだりするのが主な仕事です。RDBMSはデータベースを作成する際に,一つの大きなデータ・ファイルとしてディスク領域を確保したうえで,その中の領域を必要に応じてテーブルやレコードに割り当てていくのです。

 テーブルやレコードがディスク上にどのように格納されているのか,ということは重要なポイントです。ディスク上にデータがどのように格納されていて,それに対してストレージ・エンジンがどうアクセスするのかを把握していれば,効率のよい処理命令とはどのようなものなのかが,おのずとわかるからです。レコードが主キーの順に並んでいるとか,追加した順に格納されているとか思っている人は,ぜひ本特集のPart2を読んで,レコードの格納方法を理解してください。

 パフォーマンス・チューニングをするなら,インデックスの構造についての知識も不可欠でしょう。インデックスは元々,検索を高速にするために設定するものですが,効果を上げるためにはそれなりの知識が必要です。Part2では,インデックスをディスクに格納する方法として最もよく使われている「Bツリー」と呼ばれるデータ構造についても説明します。Bツリーは一般に,目的とするレコードにたどり着くまでに,ディスクに3~4回アクセスする必要があります。ある程度以下の大きさのテーブルであれば,インデックスを使うよりも全体を走査したほうが高速であることは何となくわかるんだけど…という人はここを読んでいただけば,その理由を知ることができるでしょう。

 RDBMSには,このほかにもいくつかの重要な機能があります。中でも実用システムにおいて重要なのは,複数のユーザーから同時にアクセスされたときの処理です。Part3では,トランザクション処理と,その基本となるロック機構について取り上げ,マルチユーザー環境におけるにデータの一貫性や整合性を実現する仕組みを説明します。

☆            ☆            ☆

 これまでRDBMSを「SQL文を投げてしばらく待つと答えが返ってくるブラックボックス」と見てきた人はもちろん,そうでない人も,「なぜそうなるのか」をきちんと理解して,ワンランク上の技術者を目指してみませんか。