データベースと秋の空・RDBMS掌握術!

第1回 RDBMSが、SQLを見てどう思うのか

この記事を読むのに必要な時間:およそ 3 分

2:Planner(プランナ)

さて,ユーティリティコマンドでない,通常のSELECT文等の場合はプランナに進みます。構文解釈された結果は,⁠何を取ってくるか」に相当する部分であり,⁠どうやって取ってくるか」ということは一切書かれていません。ですから,それを「どうやって取ってくるか」に変換しないと,実行することは出来ません。これを行うのがプランナになります。これも人間的に言い換えると「命令を理解した後,作戦を立てる」と言えばいいでしょう。

プランナでは,構文木から,相当する情報を実際に取得するための計画である,プランを作り上げます。これは,

構文木を読んで,実行すれば構文通りの検索結果を取ってくるようなプランを立て,木構造(プラン木)に作り上げる
検索条件や,それに対するテーブル名,あるいは各種構文等を読み取ってプランに仕立てます。
プランが複数個存在した場合は,その中から一番良いものを選ぶ
SQLには結合条件がどうとかというのは一切書かれないのは前述の通りです。ですから,まじめに構文木からプランを起こした場合,複数のプランが存在し得ます。そのような場合,そのなかから一番良さそうなものを基準を作って選び,それを選択とします。
もちろんたまたま1つしかプランが存在し得なかった場合は,それをそのまま選べばすみます。

という2つの段階を経ます。

PostgreSQLでは,

  • スキャンしなければいけないテーブルを調べ,可能なスキャン方法をすべて列挙します。 このとき,インデックス定義などを参照して,必要なものをすべて選びます。
  • テーブルが複数の場合,複数回のスキャンを組み合わせないと結果が得られません。 そのため,スキャンを組み合わせた結合方法を列挙します。
  • 列挙されたプランに,あらかじめ収集してあった統計情報を加味して実行コストを算出します。
  • プランごとに算出されたコストを比較し,最も小さいコストで検索可能なものを選びます。

という動作で,実際にプランを選択します。これは実行コストを元にプランを選ぶことから「コストベース」という分類になります。

プラン作成は,データベース実装での腕の見せ所の一つです。ここで最適なプランを選ぶことが出来れば,実行時間は非常に短くなる可能性が高くなります。一方で間違った,最適でないプランを選んでしまった場合には,非常に遅くなってしまう可能性もはらんでいます。

図5 構文木からプランを組み立てる

図5 構文木からプランを組み立てる

図6 コストを比較して最良のプランを選ぶ

図6 コストを比較して最良のプランを選ぶ

3:Executor (エグゼキュータ)

最後に実行されるのがエグゼキュータです。これは,作成されたプランを実行して結果を返す部分となります。これも人間的に言い換えれば「立てた作戦を実行する」にあたります。

プランは,前述の通り,作成された段階でその通りに実行すればSQL通りのデータが取得出来るようになっています。その計画に沿って,実際にテーブルやインデックスの物理的な内容にアクセスしたり,情報のフィルタリング・ソート・結合などを実施します。プランは多くの場合複数の実行内容を含んでいますから,これはそのまま指定した順に適用していきます。

最後まで適用が終了したら,望んでいた結果が得られますのでそれをクライアントに通知します。これですべての処理が終了しました!

エグゼキュータでは単にこれらの処理を実行するだけですので,プランやそのほかの条件が同じ場合にはほとんど同じ時間で実行出来ることが期待されます。しかし,実際にディスクなどにアクセスしてデータの読み書きをするのもこの部分です。このようなところでは,たとえば同時に更新が発生しないようにするとか,ディスク読み込みを最小限にするとか,プランナとは別の能力が問われます。

図7 プランを実行して結果を取得する

図7 プランを実行して結果を取得する

著者プロフィール

谷田豊盛(たにだゆたか)

国立明石工業高等専門学校卒。いったん公務員になるが,プログラミングが好きでコンピューター業界に転進。 PostgreSQLを触り出したのは6.3のころから。特にCygwinを使ったWindows環境で使っていたが,それが高じて現在ではPostgreSQLで飯を食うことに。