【すとあどぷろしーじゃ】

ストアドプロシージャ とは?

💡 DBサーバーに「保存された処理手順」
📌 このページのポイント
アプリケーション // 注文処理 EXEC PlaceOrder @userId=1 @itemId=42 アプリ側 名前を呼ぶだけ 呼び出し データベース内部 PlaceOrder(保存済みSQL) ① 在庫確認 SELECT stock FROM items ② 在庫を減らす UPDATE items SET stock... ③ 注文を記録 INSERT INTO orders... ④ 決済処理 UPDATE payments... ⑤ 完了を返す RETURN '完了' DB側で一括実行 アプリは名前を呼ぶだけ。複雑な処理はDB内のストアドが担う
アプリはプロシージャ名を呼ぶだけで、複数のSQL処理をデータベース内部で一括実行できる
ひよこ ひよこ

アプリ側でSQL書くのと何が違うの?

ペンギン先生 ペンギン先生

アプリ側のSQLはリクエストごとにパース→最適化→実行される。ストアドプロシージャは初回だけコンパイルされ、以降はキャッシュされた実行計画を使う。また複数のSQLをDB側でまとめて実行するから、アプリ↔DB間のネットワーク往復が減る。大量データの一括処理では特に差が出るよ

ひよこ ひよこ

デメリットは?

ペンギン先生 ペンギン先生

デバッグが困難(アプリ側のデバッガが使えない)、②バージョン管理が面倒(DDL文としてGit管理するか、マイグレーションツールが必要)、③DB固有のSQL方言に依存(MySQLPostgreSQLで書き方が違う)、④テストが書きにくい。最近はORMの発達でストアドプロシージャの利用は減少傾向だよ

ひよこ ひよこ

今でも使うべき場面は?

ペンギン先生 ペンギン先生

①大量データの一括処理(夜間バッチ等)、②セキュリティテーブルへの直接アクセスを禁止してプロシージャ経由のみにする)、③レガシーシステムの保守、④DB間のデータ連携。新規開発ではアプリ側にロジックを持つのが主流だけど、パフォーマンスクリティカルな処理にはまだ出番があるよ

ひよこ ひよこ

IPA試験でのポイントは?

ペンギン先生 ペンギン先生

「ストアドプロシージャのメリットを3つ挙げよ」→①事前コンパイルによる高速実行、②ネットワークトラフィックの削減、③セキュリティ(直接テーブルアクセス不要)。トリガー(特定操作で自動実行されるプロシージャ)との違いも押さえておこう。トリガーはINSERT/UPDATE/DELETEに連動して自動起動するよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ストアドプロシージャ」って出てきたら「DBに保存された再利用可能なSQLプログラム」と思えればだいたいOK!
📖 おまけ:英語の意味
「Stored Procedure」 = 格納された手続き
💬 Stored(保存された)Procedure(手続き)。DBサーバー内に処理を保存しておくよ
← 用語集にもどる