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

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

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

1:Parser(パーザ)

まず最初の処理として,パーザで処理がなされます。これは文字列表現のSQL文を,コンピューターに理解可能な形に解析します。この作業は構文解析と呼ばれ,文字列で言語を記述して実行するには必須です。人間的に言うと,命令を理解する部分と考えてよいでしょう。

構文解析によって,文字列であったSQL文は単語に分けられ,木構造(パーズツリーと呼ばれます)に変換され,コンピューターによって理解されます。

パーザは一般的に次の2ステージに分かれています。

単に文法を解釈する
この段階ではテーブル名などは展開されず,文字だけで解釈します。
解釈結果を基に,テーブル構造,カラム名などを加味して内部表現に置き換える
PostgreSQLの場合,この内部表現はOIDという値で管理されています。
内部的に,文字列で持っていたテーブル名やカラム名がIDに書き換えられ,情報参照を容易にします。

図2 パーザによる構文解析1

図2 パーザによる構文解析1

図3 パーザによる構文解析2

図3 パーザによる構文解析2

パーザを経たこの段階では,SQL文はようやくプログラムから読めるようになったに過ぎません。しかしこの解釈結果を基にその先のステージでの行動を決定するわけですから,最初の段階としては欠くべからざるものといえましょう。

PostgreSQL独特の,構文木書き換え機構─⁠─Rewriter

PostgreSQLでは,一般的なパーザとプランナの間に,リライタという仕組みが存在しています。これは,パーザから出てきた構文木をルールに従って書き換えるものです。実質的にはSQLを書き換えるのと同じことで,挙動を変更させたり,まったく実行させなかったりということが出来ます。

極端な話,SELECT文の代わりにUPDATE文を実行させる,ということも可能です。

図4 リライタがルールに従って構文木に手を加える

図4 リライタがルールに従って構文木に手を加える

リライタに任意の動作をさせるために,PostgreSQLには「ルール」と呼ばれる機構があり,CREATE RULE文などによりこれを設定させることが出来ます。それ以外にも,ビューの実装にも使います。

このような「SQLの挙動に手を加える」方法としては,ほかにトリガと言う仕組みも知られています。というよりも,むしろトリガの方が有名で,PostgreSQL以外のデータベースでもほとんど実装されているほどです。しかし,トリガと比べて,ルールは単にSQLを書き換えるのと同じことを行っています。これは機構としては非常にシンプルで使いやすいという利点もあります。

それ以外にも,リライタでは「2+3 といった固定の数式を結果に変換する」とか「重複した検索条件で要らないほうを削る」といった,文法レベルで判明する無駄を取り除くこともやっています。もっとも,こちらのほうはPostgreSQL以外でも普通に行われていることです。

1.5:ユーティリティコマンド実行

パーザにより構文解釈が終了した後,問い合わせによって2種類に分岐します。

  • SELECT, INSERT, UPDATE等の場合,次のプランナへ進む。
  • CREATE TABLE等の場合,そのままユーティリティコマンド実行に進み,結果を返す。

ユーティリティコマンドの実行内容は,それぞれのコマンドに依存します。プランを作成する必要があるかないかで分けられていると理解すればよいでしょう。

著者プロフィール

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

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