オプティマイザが実行プランを策定した後,RDBMSのエクゼキュータで実行プランを実際に処理します。「SELECT * FROM テーブル1 WHERE カラム1=100」というSQL文で説明しましょう。このSQL文は,カラム1の値が100のレコードを抽出する,という意味でした。
データベースのデータは,通常ディスク上に格納されています。RDBMSはデータ管理の専用ソフトですが,該当するレコードをディスク上で探す――なんてことはもちろんできません。RDBMSはOS上で実行するプログラムの一つにすぎず,OSの機能を使ってディスクからデータ・バッファ(メモリー)にデータを読み込み,そこで初めて数値や文字列として扱えるようになります。
ディスクからデータを読み込むには,どこにどのデータがあるのかを知っていなければなりません。具体的には,「テーブルはディスク上のどこに格納しているのか」「テーブルのカラムはどのようなデータ型がどんな順に並んでいるのか」といった情報が必要になります。そうした情報は「スキーマ情報」と呼ばれ,RDBMSの管理するカタログ・データに含まれています。前述したSQL文の場合,テーブル1のディスク上の場所を,スキーマ情報を参照して調べます。
エグゼキュータはまず,(1)OSのディスク・アクセスの機能を利用してテーブル1をデータ・バッファに読み込み,(2)データ・バッファ上で各レコードのカラム1の値が「100」かどうかを調べます(図1)。そして,カラム1の値が「100」のレコードをひとまとめにし,それらをこのSQL文の結果として返送します。
図1●基本的な動き (1)ディスク上のデータをメモリーに読み込み,(2)メモリー上で数値や文字列を解釈する。これがRDBMSの基本的な動きになる |
ディスク・アクセスの頻度で良しあし見極め
ここで考えたいことは,各処理にかかる実行時間です。(1)はディスク上のデータをデータ・バッファに読み込む「ディスク・アクセス」,(2)は値の比較を行うためにデータ・バッファ上のデータを読み取る「メモリー・アクセス」です。この二つの処理にかかる時間は大きく異なります。(1)が1回当たり数ミリ(10の-3乗)秒で,(2)が1回当たり数ナノ(10の-9乗)秒と言われており,圧倒的に(2)ディスク・アクセスの処理時間が長くなります。
つまり,SQL文の処理時間の長さは,ディスク・アクセスをどれくらい行うかでほぼ決まると言えます。これは,処理手続きの良しあしを判断する上で重要な点なので,よく覚えておいて下さい。
|