どうもこんにちは!
サバ缶(@tech_begin)です。
データベースに関する学習をしていると、よく目にする「ストアドプロシージャ」という用語。
国家資格である「基本/応用情報技術者試験」の問題にも出題されることが多いこの用語、ちゃんと理解できていますか?
正直、わたしもうろ覚えだったので今回キッチリ調べてまとめてみました!
お役に立てれば嬉しいです(間違いなどあればお気軽にご指摘ください🙇♂️)!
ストアドプロシージャとは
ストアドプロシージャ(stored procedure)は、データベース管理システム(DBMS)において提供される機能の1つです。
データベースに対する複数の操作/処理を、1つのプログラム(=ストアドプログラム)にまとめることで、1度の呼び出しでまとめて実行することが可能になります。
すでにプログラミングを学習されている方向けに例えるなら「関数」と似たようなイメージですね。
ストアドプロシージャのメリット
ストアドプロシージャを使うことで、一体どんなメリットがあるのでしょうか。
それは、以下のような理由があります。
- SQL文の実行速度がはやい
- 呼び出し側のプログラムの可読性・保守性が高まる
- サーバ負荷を減らせる
- セキュリティの向上
以下で詳しく見ていきましょう💪
SQL文の実行速度がはやい
ストアドプロシージャは、データベースに対する複数の処理をストアドプログラムに記述し、DBMSに保存しておくことで利用できます。
このストアドプログラムは、外部プログラムからSQL文を発行して処理を実行するのに比べて、すでにSQL文の解析が済んでいる状態から実行するため高速に動作します。
さらに、DBMSから呼び出し元へ実行結果を返す時間も短縮されるというメリットも。
繰り返し実行するような固定の処理であれば、ストアドプロシージャはとても有効なんです!
呼び出し側のプログラムの可読性・保守性が高まる
可読性・保守性とは、プログラムの読みやすさや管理のしやすさのことを指します。
実際の開発現場では、もちろん自分以外の人もプログラムを読み書きします。
したがって、プログラムの可読性・保守性を保つことはとても重要です。
さて、システムを開発する際、アプリケーション側とデータベース側で分けて開発することが多いです。
繰り返し実行されるSQLをまとめておくことで、アプリケーション側にSQLを実行するコードが減り、冗長になることを防ぐことができます。
「冗長」とは、プログラムを読みづらくさせ、管理を煩雑にさせる要因になる可能性があります。
これを取り除き、可読性・保守性を向上させるというメリットがあります。
<✍️MVCとかに繋がってきます。記事は準備中です!乞うご期待✍️>
サーバ負荷を減らせる
複数のSQL文を実行する場合、アプリケーションからデータベースサーバへ何度もリクエストを送る必要があります。
そうした時、(システムの規模にもよりますが)リクエストが大量にあるとサーバに負荷がかかり、処理が重くなります。
一方、ストアドプロシージャを使い1つのプログラムにまとめることによって、サーバ負荷やネットワーク使用の節約が期待できます。
規模が小さければ効果は微量でしょうが、多数のデータ通信を行う大規模システムであれば効果は絶大です。
セキュリティの向上
データベースには、クレジットカード情報などの機密情報が格納されている場合もあります。
さまざまな所からアクセス可能になるということは、それだけ攻撃を受けやすい状況であるとも言えます。
そこで、データベースへのアクセス権限をストアドプロシージャのみに制限することによって、悪意を持った人からの攻撃を防ぐことができます。
ストアドプロシージャの注意点
良いものには必ず注意しなければならないこともあります。
状況によってはデメリットにもなり得ます。注意しましょう。
- ストアドプロシージャが増えると、データベースサーバの負荷も増加する
- ストアドプログラムが流用しにくい
以下でそれぞれを詳しくみていきましょう。
ストアドプロシージャが増えると、サーバ負荷も増加する
ストアドプロシージャを使うには、ストアドプログラムをデータベース管理システムに保存しなければなりません。
つまり、データベースサーバにファイルを格納するので容量を圧迫します。
あまりに大量のストアドプロシージャを作成してしまうと、速度が低下し本末転倒です。
ストアドプログラムが流用しにくい
ストアドプロシージャで使われる言語は、データベース管理システムによってさまざまです。
そのためデータベース管理システムが変更になると、流用しにくいため学習コストや作業コストがかかる恐れがあります。
「ストアドプロシージャ」と混在されるものを比較
ストアドプロシージャとの違いが分かりにくい用語もいくつかあります。
- ストアドファンクション
- トランザクション
- バッチ
それぞれについてご紹介します。
「ストアドファンクション」との違い
「ストアドプロシージャ」と「ストアド」
現場ではまとめて「ストアド」と呼ばれることもあります。
「ストアドプロシージャ」と「ストアドファンクション」は、基本的にどちらも同じものです。
違いは「戻り値の有無」だけです。ごちゃ混ぜにならないよう注意しましょう!
- ストアドプロシージャ
- 戻り値なし
- 実行結果のみ返却
- ストアドファンクション
- 戻り値あり
- 関数のため、実行結果を戻り値として返却する
「トランザクション」との違い
「ストアドプロシージャ」と「トランザクション」、
どちらも複数のSQLを一括りにまとめ、実行することができるものです。
違いとしては、複数の処理をまとめた処理をどこから実行するかです。
ストアドプロシージャはDBMS内に保存しておき、SQLの構文解析まで済ませた状態で保存しておきます。
一方トランザクションは、外部プログラムからSQL文を発行し、それをDBMSに向けて処理を実行します。
以下のようになります。
- ストアドプロシージャ
- DBMSから実行される
- 繰り返し実行されるような定型処理
- トランザクション
- 外部プログラムから実行される
- ユーザ名など内容が変わる可能性がある自由度の高い処理
お互い、処理速度とSQL文の自由度のトレードオフになりますね。
「バッチ」との違い
「バッチ(Batch)」は、日本語に訳すると「一団、一束」といったまとまりを意味します。
そういう意味で言うと、ストアドプロシージャもバッチも同じようなものですね。
一般的にバッチは『ある一定量/一定期間ごとにプログラムを実行する処理のこと』を指します。
ストアドプロシージャは『データベースに対する複数の処理をまとめること』を指しています。
処理をまとめると言う意味では同じですが、厳密には異なりますね。
バッチ処理の中でもデータベースに対する処理を実行するときもあるので、明確な境界はありませんが、「データベースに関するのがストアドプロシージャか〜」程度に覚えておけば問題ないと思います。
基本情報、応用情報技術者試験の問題
実際に情報技術者試験で出題された問題から、学んでいきましょう!
クライアントサーバシステムにおいて,クライアント側からストアドプロシージャを利用したときの利点として,適切なものはどれか。
- ア:クライアントとサーバ間の通信量を削減できる。
- イ:サーバ内でのデータベースファイルへのアクセス量を削減できる。
- ウ:サーバのメモリ使用量を削減できる。
- エ:データベースファイルの格納領域を削減できる。
正解:ア
クライアントサーバシステムにおいて,利用頻度の高い命令群をあらかじめサーバ上のDBMSに格納しておくことによって,クライアントサーバ間のネットワーク負荷を軽減する仕組みはどれか。
- ア:2相コミットメント
- イ:グループコミットメント
- ウ:サーバプロセスのマルチスレッド化
- エ:ストアドプロシージャ
正解:エ
ストアドプロシージャの利点はどれか。
- ア:アプリケーションプログラムからネットワークを介してDBMSにアクセスする場合、両者間の通信量を減少させる。
- イ:アプリケーションプログラムからの一連の要求を一括して処理することによって、DBMS内の実行計画の数を減少させる。
- ウ:アプリケーションプログラムからの一連の要求を一括して処理することによって、DBMS内の必要バッファ数を減少させる。
- エ:データが格納されているディスク装置への I/O回数を減少させる。
正解:ア
さいごに
今回、ストアドプロシージャについてまとめました。
言葉だけ見聞きすると、馴染みがないので覚えにくい用語ですが深掘りして調べてみると印象に残りますね。
こういった技術によって私たちが使うサービスが支えられていると思うと、ワクワクします。
随時プログラミングやIT用語に関する解説記事を更新しています!
Twitterでもお気軽に絡んでくださいね〜📬