DB基礎知識

RDBMS

リレーショナルデータベースを管理するためのソフトウェアの総称である。リレーショナルデータベースのデータの2次元的広がりを効率的に扱うために用いられる。

RDBMSは大きく分けて,(1)SQL文の解釈などを実行する部分と,(2)ディスク・アクセスなどを管理する部分の二つで構成される。

リレーショナルデータベース

データの一つ一つをカラム(列)と、レコード(行)の中にまとめ、それらをテーブル(表)の中に並べるものである。リレーショナルデータベースを用いると、データ同士を比較する場合にはそれぞれ同じ位置のフィールドを見比べればよいので、データの結合や抽出が非常に容易になる。テーブルが複数であっても、あらかじめ割り振られたIDや主キーとなる項目を用いてデータ同士を関連付けることにより、テーブルを内部結合してひとつのテーブルであるかのように扱うこともできる。このとき、RDBMSでは、データベースとのやり取りに、SQL言語が用いられる。

リレーショナル・エンジン

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

しかし、リレーショナル・エンジンは,人間が考えれば明らかに効率が悪いと思われる処理方法を,推論の結果わざわざ選んでしまうこともある。検索を高速化するために定義しておいたインデックスを使ってくれない,ということも起こりうるのでリレーショナル・エンジンが効率の良い処理をするように,ユーザーやアプリケーション側から出す命令を修正してみたり,指示を与える必要がある。

ストレージ・エンジン

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

SQL

関係データベース管理システム (RDBMS) において、データの操作や定義を行うためのデータベース言語(問い合わせ言語)、ドメイン固有言語である。リレーショナル・データベース管理システム(RDBMS)が問い合わせを実行する速度は,SQL文の書き方によって大きく異なる。

SQL文実行までの流れ

(1)SQL文の解析
 RDBMSは,SQL文を受け取るとまず,そのSQL文を解析する。具体的には,そのSQL文が文法的に正しいかどうかをチェックしたり,選択,射影,結合*1といった処理がそれぞれどのように実施されるかという文の構造を把握する。データベースの管理情報を基に,SQL文に指定したテーブルやフィールドが実際に存在するかどうかや,ユーザーがそれらに対するアクセス権限を持っているかどうかをチェックする処理もここで行う。

(2)SQL文の書き換え
 解析が終わると,次にRDBMSSQL文をより高速に実行できるように書き換える。同じ結果を返すSQL文であっても,具体的な処理内容の違いによって,実行速度は大きく異なる。そこで,処理の手順を工夫したり,演算の種類を変更するといった書き換えをする。書き換えられたSQL文は,最終的にRDBMS内部の処理命令の集まりに変換される。

(3)実行計画の作成
RDBMSは,処理命令を実行する手続きを何通りか作成したうえで,その中から最も効率の良いものを選択する。こうして出来上がった,RDBMS内部の形式で表された一連の手続きのことを「実行計画」と呼ぶ。

ただ,複雑なSQL文の場合には,個々のテーブルのアクセス・パスなどの組み合わせは何千通りにもなることがある。これらをすべて調べていたのではそのために時間がかかってしまい,本末転倒になってしまう。そこで通常は,最速になりそうな実行計画の候補をある程度絞り込んだうえで比較検討する。OracleMicrosoft SQL Server(以下,SQL Server)などのRDBMSでは,作成した実行計画をキャッシュに保存しておき,同じSQL文が発行されたときにはそのキャッシュ上の実行計画を利用するようになっている。

(1)~(3)の,SQL文を解析して内部形式で表した実行計画を作成するまでの処理を,SQL文の「コンパイル」と呼ぶことがある。(2)と(3)のSQL文を高速に実行するための処理のことを,「最適化(optimization)」と呼ぶ。(1)のSQL文の解析は,RDBMSの「パーサー」と呼ばれる機能が,(2)(3)の最適化の処理は「オプティマイザ」という機能が担当する。

オプティマイザは、ルール・ベース・アプローチかコスト・ベース・アプローチによって最適な実行計画を選ぶ。

ルール・ベース・アプローチ

アクセス・パスの「ランク」に基づいて実行計画を選択する。ランクは,インデックスを使用してアクセスするかどうかなど,操作の種類によって決まる効率の度合いを表す数値です。Oracleの場合,アクセス・パスのランクは15に分かれている。基本的にランクが上位のアクセス・パスの方が高速です。OracleSQL Serverは,ツールを使用するとSQL文を実行する際の実行計画を表示することができる。

ルール・ベース・アプローチでは,ランクの上位にあるアクセス・パスを選択するのが基本です。アクセス・パスのランク付けは一般的な状況を前提にしているため,場合によっては遅いほうのパスを選択してしまうことがある。例えば,

SELECT * FROM emp WHERE eno > 500

のような範囲検索の場合,表全体の中で取り出すレコードの割合が少なければ,インデックスを使って検索したほうが高速でしょう。一方,取り出すレコードの割合が大きければ全表走査のほうが高速になる。しかし,ルール・ベース・アプローチでは,常にインデックスによる検索を選択してしまう。

これに対してコスト・ベース・アプローチでは,キーenoの統計情報から得たenoの値の範囲を基に「eno > 500」を満たすレコードの割合を推測する。そのうえで,高速と思われるほうを選択するので,こうした問題は発生しにくくなる。したがって現在では,コスト・ベース・アプローチが主流になっている。

コストベースアプローチ

使用可能なアクセス・パスやアクセスするオブジェクト(表やインデックスなど)に関する「統計情報」を使用して,アクセス・パスの「コスト」を計算する。そして,コストがもっとも低くなるものを実行計画として選択する。

ここで言うコストとは,処理に必要なリソースの消費量のことで,最も重要視されるのが処理に必要なディスク・アクセスの回数です。ほかにCPUの負荷やメモリーの使用量なども考慮される。統計情報は,テーブルのレコード数や,フィールドの値の最大値/最小値などで,RDBMSがテーブル定義などの情報とともに管理している。

キャッシュ

データを一時的に保存することで、データの処理速度を速める考え方、仕組みのこと。何度も繰り返し利用するデータを読み込み速度の早い記憶装置に保存したり、それらを物理的に近くに置くことで処理速度を上げることができる。

インデックス

インデックス(索引)は、データベースの性能を向上させる方法の一つです。インデックスは「探すレコードを識別するデータの項目」「対象レコードの格納位置を示すポインタ」で構成されており、これを利用してデータの格納位置を特定し、その位置を直接アクセスする事で、表の検索速度を上げることができる。インデックスが設定されていない場合の検索では、テーブルの最初から順番に1件ずつ探すため、時間がかかる。

アクセス・パス

「アクセス・パス」とはデータベースからデータを取り出す「経路」のことです。RDBMSでは、アプリケーションから発行されたSQLを「解析」して「実行」しており、「解析」では、SQLの構文チェック、参照されているオブジェクトの存在チェックが行われた後、データにアクセスするための経路であるアクセス・パスが決定される。