ストアドプロシージャとは何か?応用情報技術者試験の問題を解説

ストアドプロシージャの概要

ストアドプロシージャ(stored procedure) とは、関係データベース管理システム (RDBMS) に保存された一連のSQLの処理のことです。

ストアドプロシージャのストアド(stored)は「格納されている状態」を、プロシージャ(procedure)は「複数のプログラミングの処理」を意味しています。
この名前の通り、ストアドプロシージャはあらかじめデータベースサーバーに格納していた複数のSQLメッセージ群を特定の命令で実行する手法ですので、名前の由来を覚えていたほうが、ストアドプロシージャの内容を忘れないでおけると思います。

ストアドプロシージャの実例

ストアドプロシージャは以下のように記述していきます1) SQL Stored Procedures より

CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;

赤の文字で記述した"SelectAllCustomers“の部分には、保存するストアドプロシージャの名前です。任意の名前を付けることができます。
青の文字で記述した"SELECT * FROM Customers“部分には、実際に行うSQLの処理を記述していきます。
このように、2行目の"AS"の下に実行したい一連のSQLステートメントを記述していくことにより、一度の命令で複数の処理を行おうとします。

こうしたデータベースに用意したストアドプロシージャは以下のように呼び出して実行します。

EXEC SelectAllCustomers;

ストアドプロシージャのメリット

応用情報技術者試験の問題を例に

応用情報技術者試験では、ストアドプロシージャについて以下のような問題が出ています。

ストアドプロシージャの利点はどれか。

ア)アプリケーションプログラムからネットワークを介してDBMSにアクセスする場合、両者間の通信量を減少させる。
イ)アプリケーションプログラムからの一連の要求を一括して処理することによって、DBMS内の実行計画の数を減少させる。
ウ)アプリケーションプログラムからの一連の要求を一括して処理することによって、DBMS内の必要バッファ数を減少させる。
エ)データが格納されているディスク装置へのI/O回数を減少させる。

応用情報技術者試験 平成29年度秋午前問26

ここからは、この応用情報技術者試験の問題をもとに、ストアドプロシージャのメリットを見ていきます。

ストアドプロシージャのメリットは通信量を減らすこと

ストアドプロシージャのイメージ画像
参考画像1

さっそく先ほどの問題の答えになってしまいますが、ストアドプロシージャのメリットは、選択肢アの「アプリケーションプログラムからネットワークを介してDBMSにアクセスする場合、両者間の通信量を減少させる」です。

参考画像1のように、ストアドプロシージャが無ければ、データベースに1つひとつSQLの処理を命令しなければなりません。
例えば、会員情報システムを持っているとして、会員情報をデータベースに追加しようとするとき、ストアドプロシージャがなければ、「○○を呼び出して」「××を追加して」「△△をアップデートして」…と、命令をしていかなくてはなりません。
しかし、ストアドプロシージャとして、決められた処理を用意していれば、命令する側は「用意していた○○というストアドプロシージャを実行して」と依頼するだけですみます。
そうなると、命令を出したい側とデータベースの間の通信量は少なくてすみます。
これがストアドプロシージャのメリットです。

繰り返しの命令も簡単に行える

ストアドプロシージャを用意しておけば、決められた処理をいちいち命令するという手間も省くことができます。
データベースの操作と言うのは定型的な処理が少なくないため、ストアドプロシージャを使えばシステムの運用が楽になるだけでなく、命令の間違いをしてしまったという人為的なミスも防ぐことができます。

実行の数やバッファ数、I/O回数は減らない

先ほどの応用情報技術者試験の問題の正統は選択肢アでしたので、その他の選択肢は誤りになります。
つまり、選択肢イ~エに書かれているような、「実行計画の数」や「バッファ数」、「ディスク装置へのI/O回数」を減らすという効果はありません
ストアドプロシージャはあくまで、複数の処理を1つの命令で行えるようにしているだけなので、実行計画の数は減りませんし、同様に処理を滞らせないために一時的に情報を蓄えるバッファ数も変わりません。
ディスク装置への処理も変わらないため、I/O回数も変化しません。

   [ + ]

1. SQL Stored Procedures より