2007.04.04

プログラムとSQLを分離しよう ~ストアドプロシージャ利用のすすめ~

通常のシステム開発では、データベースを利用することがほとんどではないでしょうか。
データベースを利用するためには、SQLを使用します。
ところで、このSQLを単独で使用するということはあまりないのではないでしょうか?
必ずといって良いほど、なんらかのプログラム言語内に
SQLを埋め込んで使用することになるかと思います。

私はどうしても、プログラム言語内にSQLが埋め込まれているプログラムコードに
違和感を覚えてしまいます。
どうして、プログラム言語内にSQLを埋め込まなくてはいけないのでしょうか?

そもそもSQLとは、データの操作や定義を行うためのデータベース言語 (問い合わせ言語) です。
プログラム言語内にSQLを埋め込むということは、
一つのプログラム内に、二つの異なる言語を記述していることになるわけです。
いかがでしょうか?そう考えると、すごく違和感を覚えませんか?

SQLは集合指向のデータアクセス技法です。
それに対して、一般的なプログラム言語はレコード指向です。
その結果、実際の開発では、プログラム言語内でSQLを使用すると、
使いづらいと感じることがあります。
これが、一般にインピーダンス・ミスマッチと呼ばれる状況です。
プログラム言語内にそのプログラミング作法と異なる考え方(SQL)が入り込むため、
使いづらいと感じるのです。
また、プログラム言語の習熟度が低いプログラマの場合、
プログラム言語以外にSQLというもう一つの知識が必要になり、
生産性の障壁になることもあるでしょう。
その結果、SQLの扱いがぞんざいになり、
パフォーマンスの劣化を招くこともしばしばあります。

そこで、SQLの特性を生かし、高いパフォーマンスを確保しながら、
SQLの成熟度が低くても、生産性が確保できるようにする必要があります。

その方法としてお勧めなのが、ストアドプロシージャの利用です。
ストアドプロシージャとは、データベースに対する一連の処理をまとめた手続きにし、
データベースに保存したものです。
ここでいう手続きとは、SQLの集合のことになります。
加えて、各データベース固有の拡張SQLによる制御構造の追加などによって、
一般的なプログラミング言語にかなり近いことまで実現可能です。
ストアドプロシージャを利用することにより、
複雑なSQLも一つの関数としてまとめることができるのです。

ストアドプロシージャを利用することで、プログラム言語は、
ストアドプロシージャに定義されている関数のインタフェースのみを意識すればよいことになります。
プログラム言語側は、ストアドプロシージャが処理を行うのに必要なパラメータを渡し、
ストアドプロシージャが返す処理結果を受け取るだけでよいわけです。

ストアドプロシージャを利用するメリットは、
①一つの要求で、複数のSQL文を実行できる(ネットワークに対する負荷を軽減できる)。
②あらかじめ構文解析や内部中間コードへの変換を行うため、処理時間が軽減される 。
③プログラム言語とSQLとで分業が可能になる。
 技術者により得意な分野に集中することも可能。
 これにより熟練度の高いプログラマや、データベースに精通しているSEが、
 SQLの苦手な熟練度の低いプログラマに代わり、SQLをチューニングすることも容易になる。
④データベース側の思想にあった言語を利用することにより、
 間違ったプログラミングを行いにくくなる。
 その結果、パフォーマンスの劣化を防止することができる。

プログラム言語内にSQLを埋め込みながら、
違和感を覚え、SQLが使いづらいと感じている方は、
ぜひこの方法を試してください。
きっと、役に立つと思います。
ちなみに、やるなら徹底して全てのSQLをストアドプロシージャの中で実行するようにしてください。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
ilovexbiz