基本情報技術者 2017年 秋期 午前(科目A) 問26
問題文
クライアントサーバシステムにおいて、利用頻度が高い命令群をあらかじめサーバ上のDBMSに格納しておくことによって、クライアントサーバ間のネットワーク負荷を軽減する仕組みはどれか。
選択肢
ア:2相コミットメント
イ:グループコミットメント
ウ:サーバプロセスのマルチスレッド化
エ:ストアドプロシージャ(正解)
クライアントサーバでの命令群の配置による負荷軽減【午前2 解説】
要点まとめ
- 結論:サーバ側にストアドプロシージャを置くことで、クライアントとサーバ間の通信回数と転送データ量を大幅に削減できます。
- 根拠:命令群を一括でサーバ上で実行し、結果のみを返すためラウンドトリップとプロトコルオーバヘッドが減少するからです。
- 差がつくポイント:頻繁な小処理をまとめる設計、権限管理、保守性を考慮すれば性能と安全性で差がつきます。
正解の理由
正解は エ(ストアドプロシージャ)です。ストアドプロシージャはSQLやロジックをサーバのDBMS内に格納し、クライアントは「実行要求(呼出し)」だけを送ります。処理はサーバ内部で完結するため、クライアントとサーバ間の複数回の命令送受信が不要になり、ネットワーク負荷(往復回数・転送バイト数)が低減します。さらに、事前にコンパイルや最適化されるDBMSも多く、実行効率が向上します。
よくある誤解
- 「ストアドプロシージャは単にコードをサーバに置くだけで常に高速化する」:設計次第では逆に保守性が低下したり、サーバ負荷が集中して性能が悪化します。
- 「マルチスレッド化すればネットワーク負荷も同時に解決する」:マルチスレッドはサーバの並列処理能力を上げますが、ネットワーク上の往復回数や転送量自体を減らすわけではありません。
- 「2相コミットメントやグループコミットメントが通信回数を減らす」:これらは主にトランザクションの整合性やディスク書込み効率の改善であり、クライアントとサーバ間の命令数削減には直接結びつきません。
解法ステップ
- 問題文の「利用頻度が高い命令群をあらかじめサーバ上のDBMSに格納しておく」というフレーズに注目します。
- サーバに命令を格納して実行させる手法を思い出します(=ストアドプロシージャ)。
- 選択肢を読み、他の項目が意味する技術(2相コミット、グループコミット、マルチスレッド化)と比較して、ネットワーク負荷軽減に直結するものを選びます。
- ストアドプロシージャは「処理をサーバ側で完結」させるため、通信回数の減少という設問要件に合致します。
選択肢別の誤答解説
- ア: 2相コミットメント
- 説明:分散トランザクションの一貫性確保のためのプロトコルで、コミットの可否を調整します。
- なぜ不適切か:通信は増える傾向にあり、ネットワーク負荷を減らす仕組みではありません。
- イ: グループコミットメント
- 説明:複数トランザクションのログ書込みをまとめることでディスクI/O効率を上げる手法です。
- なぜ不適切か:ディスク書込み効率やスループット向上に寄与しますが、クライアント—サーバ間の命令通信を減らす機能ではありません。
- ウ: サーバプロセスのマルチスレッド化
- 説明:サーバ側で同時処理数を増やすアプローチで、スループット向上に有効です。
- なぜ不適切か:ネットワーク上の命令往復回数や送信データ量自体を減らす仕組みではなく、単に同時処理能力を改善するだけです。
- エ: ストアドプロシージャ
- 説明:DBMS内にあらかじめ命令群(関数・プロシージャ)を格納し、クライアントは呼び出すだけでサーバ側で実行されます。
- なぜ適切か:処理の多くをサーバで完結させるため、クライアントとサーバ間の通信回数と転送量が減り、ネットワーク負荷が軽減されます。
補足コラム
- ストアドプロシージャとプリペアドステートメントの違い:プリペアドステートメントはクエリをパラメタライズして複数回効率的に実行できますが、ロジックや複数命令のまとまりをサーバ側で保持して実行する点でストアドプロシージャはさらに効果的です。
- セキュリティと運用面:ストアドプロシージャはDB側で権限管理しやすく、軽微なロジック変更はDB側で済ませられますが、バージョン管理やテストが煩雑になるため運用ルールが重要です。
- 実例(簡単なストアドプロシージャの例):
CREATE PROCEDURE update_stock(IN prod_id INT, IN qty INT) BEGIN UPDATE products SET stock = stock - qty WHERE id = prod_id; INSERT INTO stock_log(product_id, change, changed_at) VALUES(prod_id, -qty, NOW()); END;
このように複数命令をサーバ側でまとめて実行すれば、クライアントからは1回の呼出しで済みます。
FAQ
Q1: ストアドプロシージャは常にネットワーク負荷を下げますか?
A1: 多くの場合は下がりますが、処理内容やデータ量によっては逆にサーバ負荷が増えたり、保守性の低下を招くことがあります。設計が重要です。
A1: 多くの場合は下がりますが、処理内容やデータ量によっては逆にサーバ負荷が増えたり、保守性の低下を招くことがあります。設計が重要です。
Q2: アプリケーション側でバッチ化すれば同じ効果は得られますか?
A2: クライアント側でバッチ化すると効果はありますが、ネットワーク往復回数を完全に排除するにはサーバ側で処理を集約するストアドプロシージャが有利です。
A2: クライアント側でバッチ化すると効果はありますが、ネットワーク往復回数を完全に排除するにはサーバ側で処理を集約するストアドプロシージャが有利です。
Q3: ストアドプロシージャはどのDBでも使えますか?
A3: ほとんどの商用・オープンソースDBMSはサポートしていますが、機能や言語仕様がDBごとに異なるため移植性は考慮が必要です。
A3: ほとんどの商用・オープンソースDBMSはサポートしていますが、機能や言語仕様がDBごとに異なるため移植性は考慮が必要です。
関連キーワード: ストアドプロシージャ、DBMS、クライアントサーバ、ネットワーク負荷、プリペアドステートメント、グループコミット、2相コミット、マルチスレッド化

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

