これから三つのSQL文を示し,それぞれの実行プランを見ていきます。実行プランとは処理手続きですので,プログラミングをかじった方であれば,プログラム上の処理を思い浮かべてください。三つのSQL文はいずれも,第4回で示したサンプル・テーブルに対するものです。

【SQL文1】
SELECT 顧客名 FROM 顧客 WHERE 顧客番号 = 1030
意味:[顧客番号]の値が1030である[顧客名]を抽出

 [顧客番号]の値が1030であるかどうかを判断するには,データをメモリー(データ・バッファ)に読み込む必要があります。考えられる処理手続きは,

○ ([顧客]テーブルの全レコードに当たる)10個のブロックをデータ・バッファに読み込み,[顧客番号]の値を判定して該当レコードを抽出

 となります。図1と併せて見ると,その動きがよく分かると思います。ディスク・アクセスが10回発生していることを確認してください。SQL文1の場合,これ以外の処理手続きは考えにくいので,この処理手続きが実行プランになるでしょう。

図1●処理手続きの実際(SQL文1)
図1●処理手続きの実際(SQL文1)
[画像のクリックで拡大表示]

【SQL文2】
SELECT 顧客番号,顧客名 FROM 顧客 WHERE 年齢 >= 30 ORDER BY 顧客番号
意味:[年齢]の値が30以上の[顧客番号]と[顧客名]を,[顧客番号]順に抽出

 SQL文2の処理手続きを考える場合,SQL文1との違いに着目したいと思います。(a)[顧客番号]で判定するか[年齢]で判定するか,(b)[顧客名]を抽出するか,[顧客番号]と[顧客名]を抽出するか,(c)[顧客番号]順に並べ替えるかどうか。この3点の違いがありますが,(a)と(b)の違いは,プログラムで言えば対象とする変数の違いであり,処理手続きとしては同じになります。よって,SQL文1とSQL文2の処理手続き上の違いは,(c)の並べ替えだけになります。

 SQL文1の処理手続きの後で,データ・バッファ上でレコードを並べ替える。SQL文2は,こうした処理手続きが考えられます。つまり,

○ 10個のブロックをデータ・バッファに読み込み,[年齢]の値を判定して該当レコードを抽出
○ [顧客番号]の値でレコードを並べ替える

 となります。図2と併せて見てください。

図2●処理手続きの実際(SQL文2)
図2●処理手続きの実際(SQL文2)
[画像のクリックで拡大表示]

【SQL文3】
SELECT 性別,COUNT(*) FROM 顧客 WHERE 年齢 >= 30 GROUP BY 性別
意味:[年齢]の値が30以上のレコードに絞ったうえで,[性別]ごとに人数(レコード数)を抽出

 SQL文3はSQL文2との違いに着目します。「ORDER BY」と「GROUP BY」は同じ処理ではありませんが,並べ替えをする,という点では同じです。処理手続き上の違いとして表れるのは,並べ替えた後で集計するかどうか,という点のみになります。考えられる処理手続きは,

○ 10個のブロックをデータ・バッファに読み込み,[年齢]の値を判定してレコードを抽出
○ [性別]の値でレコードを並べ替える
○ [性別]ごとのレコード数を集計する

 となります。図3と併せて見てください。SQL文2とSQL文3もここで示した処理手続き以外は考えにくいので,それぞれ実行プランになると考えて問題ないと思います。

図3●処理手続きの実際(SQL文3)
図3●処理手続きの実際(SQL文3)
[画像のクリックで拡大表示]

 三つのSQL文の実行プランで注目したいのは,SQL文では1行であっても,複数の処理ステップがあるということです。例えばSQL文3の場合,ブロックの読み込み,カラム値の比較,並べ替え,集計──の4ステップからなります。

 最後に,三つのSQL文の実行時間を考えてみましょう。実行時間はディスク・アクセスに大きく左右されますので,三つのSQL文とも,ディスク・アクセスの処理時間でほぼ決まると言ってよいでしょう。レコードの並べ替えは軽い処理ではありませんが,一般にディスク・アクセスに比べれば短い時間で済みます。今回示した三つのSQL文の実行プランでは10個のブロックを読み込んでいますので,ディスク・アクセス回数は10回。この回数を減らすことができれば実行時間を短くできます。そこで登場するのが「インデックス」です。インデックスは次回説明します。

監修:藤塚 勤也(ふじづか きんや) NTTデータ 基盤システム事業本部 オープンソース開発センタ 技術開発担当 シニアスペシャリスト
沖電気工業,タンデムコンピューターズ(現日本HP)を経て,2003年より株式会社 NTTデータに勤務。現在は,オープンソース・ソフトウエアを活用したエンタープライズ・システム向けの技術開発・技術支援に従事しており,特にシステムの中核であるRDBMSに注力している。「RDBMS解剖学」(翔泳社)を共著