戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2009年 春期 午前(科目A)31


問題文

データベースサーバを利用したクライアントサーバシステムにおいて、大量のSQL文が発生することによってクライアントとサーバ間の通信負荷が問題となった。このときの解決策として、適切なものはどれか。

選択肢

インデックスの見直し
ストアドプロシージャ機能の利用(正解)
データベースの再編成
動的SQLの利用

🔒 解説は解答すると表示されます

ストアドプロシージャ利用【午前解説】

正解の理由

大量のSQL発行による問題は「ネットワークの往復回数」と「SQL解析/最適化の繰返し」によるオーバーヘッドが主因です。ストアドプロシージャはサーバ側で複数SQLをまとめて実行できるため、クライアント→サーバの通信回数を劇的に減らせます。さらに、ストアドプロシージャは事前にコンパイル(あるいは実行計画のキャッシュ)されるDBMSが多く、パースと最適化の負荷も低減します。よって、通信負荷が問題の場面ではストアドプロシージャの利用が適切です。

解法ステップ

  1. ネットワーク往復が多い箇所をログやプロファイラで特定する(ホットスポット抽出)。
  2. その箇所で発行される複数SQL文をまとめられるか検討する(まとめて一回で済ませる処理単位を定義)。
  3. ストアドプロシージャで該当ロジックを実装し、パラメータで動的値を受け渡す形にする。
  4. トランザクション境界や例外処理をサーバ側で適切に扱い、結果セットを必要最小限にする。
  5. 比較測定(通信回数、往復時間、CPU/IO負荷)を行い、必要なら調整する。

選択肢別の誤答解説

  • ア: インデックスの見直し
    インデックスはクエリ実行時間やI/Oを改善しますが、クライアントが発行するSQLの回数や通信往復を直接減らす手段ではありません。通信負荷が主因の場合は効果が限定的です。
  • イ: ストアドプロシージャ機能の利用
    正解です。複数のSQLをサーバ内でまとめて実行し、クライアントとサーバ間のメッセージ往復と解析オーバーヘッドを削減できます。パラメータ化や結果の最小化で通信量も抑えられます。
  • ウ: データベースの再編成
    再編成(再配置・再構成)は断片化解消やI/O改善に役立ちますが、クライアントとサーバ間のSQL発行頻度や通信回数そのものを減らす対策ではありません。
  • エ: 動的SQLの利用
    動的SQLは柔軟性がありますが、文ごとの生成・パースが増えると往復や解析コストを増やし得ます。通信負荷を下げる逆効果になる可能性があります。

よくある誤解

  • ストアドプロシージャは常に高速という誤解:ロジックが複雑すぎるとサーバ側の負荷や保守性が悪化します。
  • インデックス調整で通信量が減ると考える誤解:インデックスは処理時間短縮に寄与しても、クライアントとサーバ間のSQL回数自体は減りません。
  • 動的SQLは柔軟ゆえに通信負荷を下げると誤解:動的SQLは却って文数やパース負荷を増やすことがあります。

補足コラム

  • ストアドプロシージャ以外の手法として「バッチ化」や「プリペアドステートメント」「結果キャッシュ」「接続プール/コネクションの再利用」も検討対象です。特にプリペアドステートメントは同一SQLの再利用でパースコストを抑える点で有効ですが、往復回数自体を削減するにはストアドプロシージャやバッチ化が優先されます。
  • 運用面では、ストアドプロシージャを増やすとDB側にビジネスロジックが集中し、開発・テスト・デプロイのワークフローに影響します。CI、バージョン管理、アクセス権限の設計に注意してください。
簡単な呼び出し例(疑似コード):
# psycopg2 風の例(PostgreSQL のストアドプロシージャ呼出し)
conn = get_connection()
cur = conn.cursor()
cur.callproc("process_many_rows", [param1, param2])
result = cur.fetchall()
cur.close()
conn.close()

FAQ

Q1: ストアドプロシージャが使えないDBや環境ではどうするべきですか?
A1: クライアント側でバッチ化して複数SQLを一括送信する、またはサーバサイドの中間API(例えば専用アプリケーションサーバ)で処理を集約する方法が代替案です。
Q2: プリペアドステートメントとストアドプロシージャはどちらが良いですか?
A2: プリペアドは同一SQLの再利用でパース負荷を下げますが、通信往復回数を減らすにはストアドプロシージャやバッチ化の方が効果が大きいです。両者は併用可能です。
Q3: セキュリティや保守で懸念はありますか?
A3: ストアドプロシージャは権限制御や入力検証を一元化できる一方、ロジックのバージョン管理やテストが難しくなるため、適切な開発プロセスを整備してください。

関連キーワード: SQL最適化、ストアドプロシージャ、ネットワーク負荷、クライアントサーバ、バッチ処理、プリペアドステートメント、接続プール
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について